我使用以下方法逐个通过TCP发送一组字符串:send(sockfd, msg, strlen(msg), 0)
并使用以下方式在服务器端接收:
while ((len=recv(fd, buf, MAXLEN, 0)) > 0) {
buf[len]='\0';
printf("%s\n", buf);
}
服务器随机打印字符串次数。有时2次,有时4次等。这是否与字符串的空终止有关?怎么了?
答案 0 :(得分:2)
没有错。 TCP是一种流传递服务。这是预期的行为。
空终止是无关的。即使它是通过TCP发送的,它的处理方式与其他字符相同。这只是普通的数据。
您可能需要多次拨打recv
才能接收单个send
发送的数据,反之亦然。
调用recv
来接收数据的次数不一定与调用send
的次数有关。 send
将字节写入流中。 recv
从流的开头读取字节。
recv
从操作系统提供的缓冲区空间中读取字节。类似于从文件读取,但是当传入的字节到达时,它们会附加到它上面。您不知道将传递多少字节。当没有更多数据要读取时,recv
会阻塞(除非您使用非阻塞套接字)。