商城首页欢迎来到中国正版软件门户

您的位置:首页 >如何在Linux C++中实现网络通信

如何在Linux C++中实现网络通信

  发布于2026-04-25 阅读(0)

扫一扫,手机访问

在Linux C++中实现网络通信:一个清晰的实战指南

在Linux环境下用C++进行网络编程,套接字(socket)是绕不开的核心工具。它就像是网络世界的“电话插座”,为不同主机间的数据交换提供了标准接口。今天,我们就来手把手拆解一个经典的TCP通信模型,看看服务器和客户端是如何“握手”并对话的。

如何在Linux C++中实现网络通信

TCP服务器示例:如何搭建一个接待员

服务器的角色,好比一个餐厅的接待员:先准备好场地(创建socket并绑定地址),然后静候客人上门(监听),最后为每一位客人提供服务(接受连接并处理数据)。下面的代码清晰地展示了这个流程。

#include 
#include 
#include 
#include 
#include 

int main() {
    int server_fd, new_socket;
    struct sockaddr_in address;
    int opt = 1;
    int addrlen = sizeof(address);
    char buffer[1024] = {0};
    const char* hello = "Hello from server";

    // 创建套接字文件描述符
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    // 设置套接字选项
    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
        perror("setsockopt");
        exit(EXIT_FAILURE);
    }

    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(8080);

    // 绑定套接字到地址
    if (bind(server_fd, (struct sockaddr*)&address, sizeof(address)) < 0) {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }

    // 监听连接
    if (listen(server_fd, 3) < 0) {
        perror("listen");
        exit(EXIT_FAILURE);
    }

    // 接受连接
    if ((new_socket = accept(server_fd, (struct sockaddr*)&address, (socklen_t*)&addrlen)) < 0) {
        perror("accept");
        exit(EXIT_FAILURE);
    }

    // 读取数据
    read(new_socket, buffer, 1024);
    std::cout << "Message from client: " << buffer << std::endl;

    // 发送数据
    send(new_socket, hello, strlen(hello), 0);
    std::cout << "Hello message sent\n";

    // 关闭套接字
    close(new_socket);
    close(server_fd);
    return 0;
}

TCP客户端示例:主动发起对话的访客

客户端则主动得多,它需要知道服务器的“门牌号”(IP地址和端口),然后主动拨号连接。连接一旦建立,双方便可以开始正式通信。

#include 
#include 
#include 
#include 
#include 

int main() {
    int sock = 0;
    struct sockaddr_in serv_addr;
    const char* hello = "Hello from client";
    char buffer[1024] = {0};

    // 创建套接字文件描述符
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        std::cout << " Socket creation error ";
        return -1;
    }

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(8080);

    // 将IPv4地址从文本转换为二进制形式
    if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
        std::cout << "Invalid address/ Address not supported ";
        return -1;
    }

    // 连接到服务器
    if (connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) {
        std::cout << "Connection Failed ";
        return -1;
    }

    // 发送数据
    send(sock, hello, strlen(hello), 0);
    std::cout << "Hello message sent\n";

    // 读取数据
    read(sock, buffer, 1024);
    std::cout << "Message from server: " << buffer << std::endl;

    // 关闭套接字
    close(sock);
    return 0;
}

编译和运行:让代码动起来

代码写好了,怎么让它跑起来呢?其实就三步,非常直观:

  1. 编译服务器和客户端代码:
g++ -o server server.cpp
g++ -o client client.cpp
  1. 运行服务器
./server
  1. 在另一个终端运行客户端:
./client

注意事项:从示例到实战的关键点

这个示例搭建了一个最基础的通信框架,但要想投入实际应用,有几个关键点必须留意:

  • 防火墙:确保你的系统防火墙(如iptablesfirewalld)允许对指定端口(这里是8080)的通信,否则连接请求会被直接拦截。
  • 错误处理:示例中的错误处理为了简洁做了简化。在生产环境中,你需要更健壮的处理机制,比如区分不同的错误类型、进行重试或优雅降级。
  • 并发处理:这个服务器一次只能服务一个客户端。现实中的服务器需要同时应对成百上千的连接。这就需要引入多线程多进程,或者更高效的多路复用技术(如selectpoll,尤其是Linux下高性能的epoll)来实现。

遵循以上步骤和要点,你就能在Linux环境下,用C++搭建起最基本的网络通信链路。这不仅是理解网络编程的起点,也是构建更复杂分布式系统的基石。

本文转载于:https://www.yisu.com/ask/92549971.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注