我一直在阅读 Beej's Guide to Network Programming 获取 TCP 连接的句柄。在其中一个示例中,简单 TCP 流客户端的客户端代码如下所示:
if ((numbytes = recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) {
perror("recv");
exit(1);
}
buf[numbytes] = '\0';
printf("Client: received '%s'\n", buf);
close(sockfd);
我已将缓冲区设置为小于我要发送的字节总数。我不太确定如何获得其他字节。我是否必须循环 recv()
直到收到 '\0'
?
*请注意,在服务器端,我还实现了他的 sendall()
函数,因此它实际上应该将所有内容发送到客户端。
另请参阅 6.1. A Simple Stream Server 在指南中。
最佳答案
是的,您将需要多次 recv()
调用,直到获得所有数据。
要知道什么时候,使用 recv()
的返回状态是没有用的 - 它只能告诉您已收到多少字节,而不是有多少字节可用,因为有些字节可能仍然可用正在运输途中。
如果您收到的数据以某种方式对总数据的长度进行编码,那就更好了。读取尽可能多的数据,直到知道长度是多少,然后读取直到收到 length
数据。为此,可以采用多种方法;常见的方法是,一旦知道长度是多少,就创建一个足够大的缓冲区来容纳所有数据。
另一种方法是使用固定大小的缓冲区,并始终尝试接收 min(missing, bufsize)
,在每次 recv()< 后减少
.missing
/
关于c++ - 用 C 处理 TCP 的部分返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32678096/