首页 > 编程语言 >Linux C++怎样进行网络通信

Linux C++怎样进行网络通信

来源:互联网 2026-04-22 19:42:05

Linux C++网络通信:从基础套接字到实战示例 在Linux环境下用C++搞网络通信,套接字(socket)编程是绕不开的基石。简单来说,它就像是给不同计算机上的进程开了条“专用电话线”,让它们能通过互联网或局域网顺畅地交换数据。下面,我们就通过一个经典的TCP/IP通信实例,把服务器端和客户端

Linux C++网络通信:从基础套接字到实战示例

在Linux环境下用C++搞网络通信,套接字(socket)编程是绕不开的基石。简单来说,它就像是给不同计算机上的进程开了条“专用电话线”,让它们能通过互联网或局域网顺畅地交换数据。下面,我们就通过一个经典的TCP/IP通信实例,把服务器端和客户端的搭建过程完整走一遍。

Linux C++怎样进行网络通信

长期稳定更新的攒劲资源: >>>点此立即查看<<<

服务器端

服务器端的角色,好比一个守候在固定地址的接待员。它的核心任务就四步:创建套接字、绑定地址、监听连接、处理请求。来看具体实现:

#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";

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

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

    // 绑定socket到本地地址和端口
    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;
}

客户端

客户端则扮演主动呼叫者的角色。流程相对直接:创建套接字、指定服务器地址、发起连接、然后开始对话。代码如下:

#include 
#include 
#include 
#include 
#include 

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

    // 创建socket文件描述符
    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;
}

简单梳理一下这个例子的工作流程:服务器在8080端口进入监听状态,静静等待。客户端则主动向本机(127.0.0.1)的8080端口发起连接。握手成功后,客户端率先发送问候,服务器收到后打印消息并回复,一次完整的“握手-对话-告别”流程就此完成。

想要运行起来?编译环节很简单,使用g++分别处理即可:

g++ -o server server.cpp
g++ -o client client.cpp

接着,先启动服务器,再运行客户端,就能看到通信效果:

./server
./client

当然,这只是一个最基础的模型,相当于网络编程的“Hello World”。真实的项目环境要复杂得多:你得考虑各种网络异常和错误处理,可能还需要引入多线程或多进程来应对海量并发连接。如果项目规模继续扩大,像Boost.Asio、libevent或libuv这些专门的高性能网络库,就该成为你的得力工具了。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备14008430号-1 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。