TCP阻塞套接字 - 在不同的数据包中recv少量字节的可能性

时间:2014-01-01 14:35:32

标签: sockets tcp packet

如果服务器发送4个字节

send(sock, buffer1, 4, 0);

客户端正好等待4个字节

recv(sock, buffer2, 4, 0);

是否有可能将少于4个字节写入buffer2? 之前没有制作过其他sendrecv

如果没有可能,send可以执行的缓冲区的最大大小是什么,这样recv可以在一次调用中获得相同的缓冲区大小。

3 个答案:

答案 0 :(得分:4)

除了你自己划分的内容之外,没有“消息”这样的东西。

REPEAT :这里没有任何信息。

TCP不发送消息,它发送一个八位字节流。

你需要发送一个循环,以防积压的未确认数据和send不使用你传入的整个缓冲区。你需要在一个循环中收集,以防发送堆栈被分块它以一种意想不到的方式。您需要分隔您的消息(例如,通过预先设置网络端长度),以便您可以正确地恢复它们。

答案 1 :(得分:2)

来自recv的手册页:

“这些调用返回接收的字节数,如果发生错误则返回-1。

对于TCP套接字,返回值0表示对等体已关闭其连接的一半。“

因此recv 总是允许返回发送的所有字节,少于发送的字节数,或者没有发送的字节数。您不能仅仅因为您碰巧知道send在连接的另一端正在做什么而假设任何事情。

无法保证您始终可以获得完整的信息。

答案 2 :(得分:1)

是的,有这种可能性。实际上,recv为您提供了返回值作为接收的字节数。