在 C/C++ 中,从 TCP 套接字读取数据通常涉及以下步骤:
1. 创建和设置套接字
首先,需要创建一个套接字并连接到服务器。例如,使用 socket()
函数创建套接字,然后使用 connect()
连接到服务器。
cint sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("Error creating socket"); exit(EXIT_FAILURE); } struct sockaddr_in serv_addr; memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(port); inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr); if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { perror("Error connecting to server"); exit(EXIT_FAILURE); }
2. 读取数据
使用 recv()
或 read()
函数从套接字读取数据。这两个函数都可以从连接的套接字中读取数据,但 recv()
提供了额外的功能,如指定消息的标志。
使用 recv()
cchar buffer[1024]; ssize_t n_read = recv(sockfd, buffer, sizeof(buffer), 0); if (n_read < 0) { perror("Error reading from socket"); exit(EXIT_FAILURE); } else if (n_read == 0) { printf("Server closed the connection\n"); } else { printf("Received %ld bytes: %s\n", n_read, buffer); }
使用 read()
cchar buffer[1024]; ssize_t n_read = read(sockfd, buffer, sizeof(buffer)); if (n_read < 0) { perror("Error reading from socket"); exit(EXIT_FAILURE); } else if (n_read == 0) { printf("Server closed the connection\n"); } else { printf("Received %ld bytes: %s\n", n_read, buffer); }
3. 处理 TCP 流的特性
在 TCP 通信中,数据分段和重新组合都是自动进行的,因此接收到的数据可能不会一次性完整地到达。可能需要多次调用 recv()
或 read()
来完全接收预期的数据量。
4. 关闭套接字
数据读取完成后,关闭套接字:
cclose(sockfd);
总结
正确地从 TCP 套接字读取数据要注意循环调用读取函数直到收到所有数据,处理各种可能的返回值,并且在结束时关闭套接字。此外,错误处理也是实现过程中不可或缺的一部分,确保程序的健壁性和稳定性。
2024年6月29日 12:07 回复