温馨提示×

linux c++ socket怎么用

小樊
40
2026-10-22 16:04:47
栏目: 编程语言

下面给你一个Linux 下 C++ 使用 socket 的最小可运行示例,覆盖 TCP 服务端 / 客户端,并解释每一步在做什么。


一、基本流程(TCP)

服务端流程

  1. socket() 创建 socket
  2. bind() 绑定 IP + 端口
  3. listen() 监听
  4. accept() 等待客户端连接
  5. recv() / send() 收发数据
  6. close() 关闭

客户端流程

  1. socket()
  2. connect()
  3. send() / recv()
  4. close()

二、TCP 服务端示例(C++)

// server.cpp
#include <iostream>
#include <cstring>
#include <unistd.h>
#include <arpa/inet.h>

int main() {
    int server_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (server_fd < 0) {
        perror("socket");
        return 1;
    }

    sockaddr_in addr{};
    addr.sin_family = AF_INET;
    addr.sin_port = htons(8080);
    addr.sin_addr.s_addr = INADDR_ANY;

    if (bind(server_fd, (sockaddr*)&addr, sizeof(addr)) < 0) {
        perror("bind");
        return 1;
    }

    if (listen(server_fd, 5) < 0) {
        perror("listen");
        return 1;
    }

    std::cout << "Server listening on port 8080..." << std::endl;

    int client_fd = accept(server_fd, nullptr, nullptr);
    if (client_fd < 0) {
        perror("accept");
        return 1;
    }

    char buf[1024];
    ssize_t n = recv(client_fd, buf, sizeof(buf) - 1, 0);
    if (n > 0) {
        buf[n] = '\0';
        std::cout << "Client: " << buf << std::endl;
        send(client_fd, "Hello from server", 18, 0);
    }

    close(client_fd);
    close(server_fd);
    return 0;
}

三、TCP 客户端示例(C++)

// client.cpp
#include <iostream>
#include <cstring>
#include <unistd.h>
#include <arpa/inet.h>

int main() {
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock < 0) {
        perror("socket");
        return 1;
    }

    sockaddr_in addr{};
    addr.sin_family = AF_INET;
    addr.sin_port = htons(8080);
    inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);

    if (connect(sock, (sockaddr*)&addr, sizeof(addr)) < 0) {
        perror("connect");
        return 1;
    }

    send(sock, "Hello server", 12, 0);

    char buf[1024];
    ssize_t n = recv(sock, buf, sizeof(buf) - 1, 0);
    if (n > 0) {
        buf[n] = '\0';
        std::cout << "Server: " << buf << std::endl;
    }

    close(sock);
    return 0;
}

四、编译 & 运行

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

./server &
./client

五、常见注意点

✅ 头文件

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

✅ 端口要用 htons()
✅ recv 可能返回 0(断开)或 -1(错误)
✅ TCP 是流式协议,需要自己处理粘包


六、进阶方向(如果你需要)

  • 多客户端:fork / pthread / epoll
  • UDP socket
  • 非阻塞 + select / epoll
  • C++ 封装 socket 类
  • 使用 Boost.Asio / libevent

如果你告诉我:

  • 是 TCP 还是 UDP
  • 是否要 多客户端
  • 是否用于 实际项目

我可以直接给你更合适的代码。

0 踩