我一直在读Beej 的网络编程指南 http://beej.us/guide/bgnet/获取 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.一个简单的流服务器 http://beej.us/guide/bgnet/output/html/multipage/clientserver.html#simpleserver在指南中。
是的,您将需要多个recv()
调用,直到获得所有数据。
要知道那是什么时候,请使用来自的返回状态recv()
不好 - 它只告诉您已收到多少字节,而不告诉您有多少字节可用,因为有些字节可能仍在传输中。
如果您收到的数据以某种方式对总数据的长度进行编码,那就更好了。读取尽可能多的数据,直到知道长度是多少,然后读取直到收到length
数据。为此,可以采取多种方法;常见的方法是,一旦知道长度是多少,就创建一个足够大的缓冲区来容纳所有数据。
另一种方法是使用固定大小的缓冲区,并始终尝试接收min(missing, bufsize)
,减少missing
每个之后recv()
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)