C++中进行Socket网络编程主要依赖操作系统提供的网络API,Windows和Linux平台实现略有不同,但基本流程相似,包括创建套接字、绑定地址、监听(服务端)、连接(客户端)、收发数据、关闭套接字。以下是具体方法:
一、Windows平台下的C++ Socket编程Windows使用Winsock库进行网络编程,需包含Winsock2.h头文件,并链接ws2_32.lib库。
- 基本步骤:
初始化Winsock:调用WSAStartup()。
创建套接字:使用socket()。
绑定IP和端口(服务端):通过bind()。
监听连接(服务端):调用listen()。
接受连接(服务端):使用accept()。
发起连接(客户端):通过connect()。
发送/接收数据:分别用send()和recv()。
关闭套接字:调用closesocket()。
清理Winsock:执行WSACleanup()。
- 示例代码(服务端):
#include <iostream>#include <Winsock2.h>#pragma comment(lib, "ws2_32.lib")int main() { WSADATA wsa; WSAStartup(MAKEWORD(2, 2), &wsa); SOCKET server = socket(AF_INET, SOCK_STREAM, 0); sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(8080); addr.sin_addr.s_addr = INADDR_ANY; bind(server, (sockaddr*)&addr, sizeof(addr)); listen(server, 5); std::cout << "等待客户端连接...n"; SOCKET client = accept(server, nullptr, nullptr); char buffer[1024] = {0}; recv(client, buffer, sizeof(buffer), 0); std::cout << "收到消息:" << buffer << std::endl; send(client, "Hello from server", 17, 0); closesocket(client); closesocket(server); WSACleanup(); return 0;}二、Linux平台下的C++ Socket编程Linux使用POSIX标准的socket API,需包含<sys/socket.h>、<netinet/in.h>等头文件。
- 关键差异:
无需WSAStartup和WSACleanup。
套接字类型为int而非SOCKET。
关闭套接字使用close()函数。
- 示例代码(客户端):
#include <iostream>#include <sys/socket.h>#include <netinet/in.h>#include <unistd.h>#include <arpa/inet.h>int main() { int sock = socket(AF_INET, SOCK_STREAM, 0); sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(8080); addr.sin_addr.s_addr = inet_addr("127.0.0.1"); connect(sock, (sockaddr*)&addr, sizeof(addr)); send(sock, "Hello from client", 17, 0); char buffer[1024] = {0}; recv(sock, buffer, sizeof(buffer), 0); std::cout << "收到回复:" << buffer << std::endl; close(sock); return 0;}三、跨平台注意事项若希望代码在Windows和Linux上都能运行,可采取以下措施:
四、常见问题与建议实际开发中需注意以下几点:
- 检查返回值:每个系统调用后都应检查返回值,判断是否成功。
- 处理阻塞与非阻塞模式:根据需求选择合适的模式。
- 设计数据包格式:合理设计数据包格式,避免粘包问题(可加长度头)。
- 并发处理:多客户端场景下,服务端可用多线程或I/O复用(select/poll/epoll)处理并发。
掌握基础API后,可逐步学习更高级的异步通信和协议设计。