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

您的位置: 首页 > 文章列表 > 编程开发 > Ubuntu下C++网络编程如何操作

Ubuntu下C++网络编程如何操作

  发布于2026-07-07 阅读(0)

扫一扫,手机访问

在Ubuntu下用C++搞网络编程,其实没有想象中那么复杂。核心就是搞懂套接字(sockets)、IP地址、端口号这几个基本概念,然后一步步搭起一个简单的通信框架。下面直接上干货,从环境准备到实战代码,一步步带你走通。

Ubuntu下C++网络编程如何操作

1. 安装必要的库

Ubuntu系统自带的g++编译器已经足够处理标准网络编程接口,基本不需要额外安装依赖。不过为了确保编译环境完整,还是建议先更新一下包管理器,并安装build-essential工具包——它会把常用的编译工具一次性配齐。

sudo apt-get update
sudo apt-get install build-essential

2. 编写C++网络程序

下面直接给出一套经典的TCP通信示例,包括服务器端和客户端。代码中的注释已经足够清晰,关键步骤都标出来了。

TCP服务器

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

    // 创建套接字文件描述符
    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 from server", 18, 0);
    std::cout << "Hello message sent\n";

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

TCP客户端

#include 
#include 
#include 
#include 
#include 

int main() {
    int sock = 0;
    struct sockaddr_in serv_addr;
    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 from client", 18, 0);
    std::cout << "Hello message sent\n";

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

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

3. 编译和运行程序

编译过程很简单,直接用g++分别编译服务器和客户端源文件,生成两个可执行文件:

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

先在一个终端启动服务器

./server

然后在另一个终端运行客户端:

./client

不出意外的话,你会看到服务器端打印出客户端的消息,客户端也收到了服务器的回应。一个最基础的TCP通信就这样跑通了。

4. 调试和优化

实际项目里,单是跑通一个连接远远不够。你需要考虑多线程处理多个客户端、更完善的错误处理、数据序列化与反序列化等等。调试方面,gdb是Linux下最常用的工具;性能分析则可以用gprof定位热点代码。这些工具都能帮你把代码从“能跑”打磨到“稳健”。

说到底,网络编程的入门门槛并不高,关键是把socket生命周期、地址结构、错误处理这些基础吃透。上面的例子就是一套标准模板,理解了它,后续无论是扩展成HTTP服务器还是自定义协议,都只是在这个框架上做加法。

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

热门关注