C++中TCP通信通过Socket API实现,Windows使用Winsock,Linux使用POSIX接口。1. 服务器步骤:初始化、创建套接字、绑定地址、监听、接受连接、收发数据;客户端流程:初始化、创建套接字、连接服务器、发送接收数据。2. 示例代码包含条件编译支持跨平台,需链接ws2_32.lib(Windows)。3. 编译运行:Linux用g++ server.cpp -o server,Windows需链接库;先启服务器监听8080端口,再运行客户端连接。4. 注意事项:需检查send/recv返回值,实际应用应增加错误处理、多客户端支持(如多线程或select/poll),此例适用于学习基础通信流程。

在C++中实现TCP服务器和客户端通信,主要依赖于操作系统的套接字(Socket)API。在Windows上使用Winsock,在Linux/Unix上使用POSIX socket接口。下面分别给出一个简单的TCP服务器和客户端示例,适用于初学者理解基本流程。
1. TCP服务器端实现(C++)
服务器的主要步骤包括:初始化套接字、绑定地址、监听连接、接受客户端连接、收发数据。
Windows 示例(需链接 ws2_32.lib):
#include#ifdef _WIN32 #include #include #pragma comment(lib, "ws2_32.lib") #else #include #include #include #include #endif int main() { #ifdef _WIN32 WSADATA wsa; if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) { std::cerr << "WSA启动失败\n"; return 1; } #endif // 创建套接字 int server_fd = socket(AF_INET, SOCK_STREAM, 0); if (server_fd == -1) { std::cerr << "套接字创建失败\n"; return 1; } // 设置地址结构 struct sockaddr_in address; 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)) == -1) { std::cerr << "绑定失败\n"; return 1; } // 监听 if (listen(server_fd, 5) == -1) { std::cerr << "监听失败\n"; return 1; } std::cout << "服务器正在监听 8080 端口...\n"; // 接受连接 struct sockaddr_in client_addr; socklen_t client_len = sizeof(client_addr); int client_fd = accept(server_fd, (struct sockaddr*)&client_addr, &client_len); if (client_fd == -1) { std::cerr << "接受连接失败\n"; return 1; } std::cout << "客户端已连接: " << inet_ntoa(client_addr.sin_addr) << "\n"; // 接收数据 char buffer[1024] = {0}; int bytes = recv(client_fd, buffer, sizeof(buffer) - 1, 0); if (bytes > 0) { std::cout << "收到: " << buffer << "\n"; // 回传响应 send(client_fd, "Hello from server!", 18, 0); } // 关闭连接 close(client_fd); close(server_fd); #ifdef _WIN32 closesocket(server_fd); WSACleanup(); #endif return 0; }
2. TCP客户端实现(C++)
客户端流程:初始化、创建套接字、连接服务器、发送/接收数据。
立即学习“C++免费学习笔记(深入)”;
#include#ifdef _WIN32 #include #include #pragma comment(lib, "ws2_32.lib") #else #include #include #include #include #endif int main() { #ifdef _WIN32 WSADATA wsa; if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) { std::cerr << "WSA启动失败\n"; return 1; } #endif int sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == -1) { std::cerr << "套接字创建失败\n"; return 1; } struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(8080); inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr); // 连接服务器 if (connect(sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) { std::cerr << "连接失败\n"; return 1; } std::cout << "已连接到服务器\n"; // 发送数据 const char* msg = "Hello from client!"; send(sock, msg, strlen(msg), 0); // 接收响应 char buffer[1024] = {0}; int bytes = recv(sock, buffer, sizeof(buffer) - 1, 0); if (bytes > 0) { std::cout << "服务器响应: " << buffer << "\n"; } close(sock); #ifdef _WIN32 closesocket(sock); WSACleanup(); #endif return 0; }
3. 编译与运行说明
- Linux 编译:g++ server.cpp -o server
- Windows 编译:使用 Visual Studio 或 g++(MinGW),确保链接 ws2_32.lib
- 先运行服务器,再运行客户端
- 服务器监听 127.0.0.1:8080,客户端连接该地址
4. 注意事项
- 错误处理很重要,实际项目中应更完善
- 支持多客户端需使用多线程或IO复用(如select/poll)
- 跨平台代码可用宏区分Win/Linux
- send/recv 返回值需检查,可能未一次性收发全部数据
基本上就这些。这个例子展示了最基本的TCP通信流程,适合学习网络编程基础。











