乐闻世界logo
搜索文章和话题

What is the correct way of reading from a TCP socket in C/ C ++?

5 个月前提问
4 个月前修改
浏览次数25

1个答案

1

在 C/C++ 中,从 TCP 套接字读取数据通常涉及以下步骤:

1. 创建和设置套接字

首先,需要创建一个套接字并连接到服务器。例如,使用 socket() 函数创建套接字,然后使用 connect() 连接到服务器。

c
int 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()

c
char 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()

c
char 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. 关闭套接字

数据读取完成后,关闭套接字:

c
close(sockfd);

总结

正确地从 TCP 套接字读取数据要注意循环调用读取函数直到收到所有数据,处理各种可能的返回值,并且在结束时关闭套接字。此外,错误处理也是实现过程中不可或缺的一部分,确保程序的健壁性和稳定性。

2024年6月29日 12:07 回复

你的答案