来自recv(2)
手册页:
MSG_WAITALL
该标志请求操作块直到满足完整请求。但是,如果捕获到信号,发生错误或断开连接,或者接收的下一个数据与返回的数据类型不同,则调用仍可能返回的数据少于请求的数据。
看起来send(2)
没有相应的标志,这让我觉得很奇怪。也许send()
可以保证总是接受整个缓冲区,但是我没有看到写在任何地方(无论如何,这对我来说似乎不太可能)。
有没有办法让send()
等到它返回之前发送整个缓冲区,等同于recv()
的{{1}}?
编辑:我知道send()只是将数据复制到操作系统的缓冲区中,并且我不能强制send()将数据放到线路上。我的问题是:我可以强制send()阻止,直到我给它的所有数据都被复制到OS的缓冲区中?
答案 0 :(得分:0)
You can't。 send
只是将缓冲区卸载到内核,然后返回。
send()
函数将启动从指定套接字到其对等方的消息传输(...) 成功完成对send()的调用并不能保证传递消息。
注意“启动”一词。它实际上并不发送任何内容,而是告诉操作系统在它准备就绪时发送消息(当缓冲区已满或经过一段时间后)。
答案 1 :(得分:0)
send(2)
实际上并没有“发送”任何内容,而是将您的字节放入套接字发送缓冲区。它告诉你它能够在返回值中复制多少字节。
使发送缓冲区更大(请参阅setsockopt(2)
和tcp(7)
),注意系统调用返回值。在任何情况下,TCP都是一个流。您需要自己管理应用程序级协议。