c++ - 用 C 处理 TCP 的部分返回

标签 c++ c sockets tcp

我一直在阅读 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/

相关文章:

c++ - 私有(private)/ protected /公共(public)如何影响 ABI?

第一个计算程序的C问题

c++ - C++中的内部链接有什么意义

c++ - 如何在 Windows 7 中申请管理员权限?

c++ - 在 C++ 中动态创建函数调用

c - 在 C 中加载 .mo 文件

linux - epoll的EPOLLEXCLUSIVE模式如何与电平触发相互作用?

c - ioctl() 用于 C 语言套接字编程

java - Telnet session 与 TCP session

c++ - 如何在 Windows 上使用 makefile 编译非托管 *.dll