如果服务器发送4个字节
send(sock, buffer1, 4, 0);
客户端正好等待4个字节
recv(sock, buffer2, 4, 0);
是否有可能将少于4个字节写入buffer2
?
之前没有制作过其他send
或recv
。
如果没有可能,send
可以执行的缓冲区的最大大小是什么,这样recv
可以在一次调用中获得相同的缓冲区大小。
答案 0 :(得分:4)
除了你自己划分的内容之外,没有“消息”这样的东西。
REPEAT :这里没有任何信息。
TCP不发送消息,它发送一个八位字节流。
你需要发送一个循环,以防积压的未确认数据和send
不使用你传入的整个缓冲区。你需要在一个循环中收集,以防发送堆栈被分块它以一种意想不到的方式。您需要分隔您的消息(例如,通过预先设置网络端长度),以便您可以正确地恢复它们。
答案 1 :(得分:2)
来自recv
的手册页:
“这些调用返回接收的字节数,如果发生错误则返回-1。
对于TCP套接字,返回值0表示对等体已关闭其连接的一半。“
因此recv
总是允许返回发送的所有字节,少于发送的字节数,或者没有发送的字节数。您不能仅仅因为您碰巧知道send
在连接的另一端正在做什么而假设任何事情。
无法保证您始终可以获得完整的信息。
答案 2 :(得分:1)
是的,有这种可能性。实际上,recv为您提供了返回值作为接收的字节数。