最小可运行示例(C++ TCP回显)

下面是最经典的 TCP "回显服务器":客户端发什么,服务端原样回什么 。
1、服务端 server.cpp

cpp 复制代码
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h>

#include <cstring>
#include <iostream>

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

    // 允许端口快速复用(避免 TIME_WAIT 影响)
    int opt = 1;
    setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

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

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

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

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

    sockaddr_in client{};
    socklen_t client_len = sizeof(client);
    int conn_fd = accept(listen_fd, (sockaddr*)&client, &client_len);
    if (conn_fd < 0) {
        perror("accept");
        close(listen_fd);
        return 1;
    }

    char ip[INET_ADDRSTRLEN];
    inet_ntop(AF_INET, &client.sin_addr, ip, sizeof(ip));
    std::cout << "Client connected: " << ip << ":" << ntohs(client.sin_port) << "\n";

    char buf[1024];
    while (true) {
        ssize_t n = recv(conn_fd, buf, sizeof(buf), 0);
        if (n == 0) {
            std::cout << "Client disconnected.\n";
            break;
        }
        if (n < 0) {
            perror("recv");
            break;
        }

        // 回显
        ssize_t sent = send(conn_fd, buf, n, 0);
        if (sent < 0) {
            perror("send");
            break;
        }
    }

    close(conn_fd);
    close(listen_fd);
    return 0;
}

2、客户端 client.cpp

cpp 复制代码
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h>

#include <cstring>
#include <iostream>
#include <string>

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

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

    if (connect(fd, (sockaddr*)&server, sizeof(server)) < 0) {
        perror("connect");
        close(fd);
        return 1;
    }

    std::cout << "Connected to server. Type messages:\n";

    std::string line;
    char buf[1024];
    while (std::getline(std::cin, line)) {
        if (line == "quit") break;

        if (send(fd, line.data(), line.size(), 0) < 0) {
            perror("send");
            break;
        }

        ssize_t n = recv(fd, buf, sizeof(buf), 0);
        if (n <= 0) {
            std::cout << "Server closed.\n";
            break;
        }

        std::cout << "echo: " << std::string(buf, buf + n) << "\n";
    }

    close(fd);
    return 0;
}

3、编译运行(Linux)

cpp 复制代码
g++ server.cpp -o server
g++ client.cpp -o client

./server
# 另开一个终端
./client
相关推荐
“AI国潮设计-小江”37 分钟前
《Python+SDXL实战:用ControlNet精准控制“英歌舞翻糖吐司”构图,附批量生成脚本》
开发语言·人工智能·python·prompt·aigc
程序喵大人44 分钟前
【C++入门】编译链接模型 - 01 一个 C++ 程序是怎样变成可执行文件的
开发语言·c++·编译链接模型
by209992 小时前
vector 的模拟实现:扩容与边界的详细阐述(下)
c++·经验分享·vector·动态数组
sunshine22 girl2 小时前
Java学习七 Java 项目实战1-项目创建和主页面搭建
java·开发语言·学习
XiaoMaqqqq2 小时前
市面上正规的IP驱动产业新场景新工具哪家强
运维·python·网络协议·tcp/ip
菜鸟~noob2333 小时前
【电子战】第三季预告—波武器与电子系统强力毁伤
开发语言·数据库·matlab·电子战
ShyanZh3 小时前
【Python3基础】19-Socket 与 TCP、UDP 编程
python·网络协议·tcp/ip·udp
惊讶的猫4 小时前
工具选对之后还不够:商城 Agent 的参数与权限治理
开发语言·python
cmpxr_4 小时前
【MicroPython】如何刷新ESP8266的固件
开发语言·micropython
搭贝4 小时前
上厕所的时间搭好一套系统:AI自动生成实测
开发语言·人工智能·低代码·ai·php·搭贝