使用recv

时间:2016-01-27 00:47:21

标签: c networking tcp network-programming

我使用以下方法逐个通过TCP发送一组字符串:send(sockfd, msg, strlen(msg), 0)并使用以下方式在服务器端接收:

while ((len=recv(fd, buf, MAXLEN, 0)) > 0) {
            buf[len]='\0';
            printf("%s\n", buf);
}

服务器随机打印字符串次数。有时2次,有时4次等。这是否与字符串的空终止有关?怎么了?

1 个答案:

答案 0 :(得分:2)

没有错。 TCP是一种流传递服务。这是预期的行为。

空终止是无关的。即使它是通过TCP发送的,它的处理方式与其他字符相同。这只是普通的数据。

您可能需要多次拨打recv才能接收单个send发送的数据,反之亦然。

调用recv来接收数据的次数不一定与调用send的次数有关。 send将字节写入流中。 recv从流的开头读取字节。

recv从操作系统提供的缓冲区空间中读取字节。类似于从文件读取,但是当传入的字节到达时,它们会附加到它上面。您不知道将传递多少字节。当没有更多数据要读取时,recv会阻塞(除非您使用非阻塞套接字)。