MSG_READALL是recv()为??是发送()

时间:2010-11-30 18:51:59

标签: sockets unix tcp

来自recv(2)手册页:

  

MSG_WAITALL

     

该标志请求操作块直到满足完整请求。但是,如果捕获到信号,发生错误或断开连接,或者接收的下一个数据与返回的数据类型不同,则调用仍可能返回的数据少于请求的数据。

看起来send(2)没有相应的标志,这让我觉得很奇怪。也许send()可以保证总是接受整个缓冲区,但是我没有看到写在任何地方(无论如何,这对我来说似乎不太可能)。

有没有办法让send()等到它返回之前发送整个缓冲区,等同于recv()的{​​{1}}?

编辑:我知道send()只是将数据复制到操作系统的缓冲区中,并且我不能强制send()将数据放到线路上。我的问题是:我可以强制send()阻止,直到我给它的所有数据都被复制到OS的缓冲区中?

2 个答案:

答案 0 :(得分:0)

You can'tsend只是将缓冲区卸载到内核,然后返回。

引用Unix standard

  

send()函数将启动从指定套接字到其对等方的消息传输(...)   成功完成对send()的调用并不能保证传递消息。

注意“启动”一词。它实际上并不发送任何内容,而是告诉操作系统在它准备就绪时发送消息(当缓冲区已满或经过一段时间后)。

答案 1 :(得分:0)

TCP的

send(2)实际上并没有“发送”任何内容,而是将您的字节放入套接字发送缓冲区。它告诉你它能够在返回值中复制多少字节。

使发送缓冲区更大(请参阅setsockopt(2)tcp(7)),注意系统调用返回值。在任何情况下,TCP都是一个流。您需要自己管理应用程序级协议。