WSASend()是否隐藏了大型缓冲区的批处理?

时间:2015-04-23 22:34:11

标签: tcp buffer winsock

我正在测试大缓冲区,我在WSABUF中设置它并接下来调用WSASend()

但是,WSARecv()只是一次性将它传回那个大缓冲区。

这有意义吗?

对于大缓冲区,WSASend()WSARecv()的限制在哪里?

似乎批处理正在后台进行,所有这些都隐藏在抽象之后。

如果是这种情况,我希望这一切都会发生在我的应用程序中。

1 个答案:

答案 0 :(得分:2)

限制分别是套接字发送和接收缓冲区大小。

套接字发送缓冲区已满时

WSASend()阻塞,并且当所有内容都已传输到套接字发送缓冲区时返回。同时,异步,TCP正在从套接字发送缓冲区中删除数据,以一种你无法控制的方式将其转换为TCP段,并将这些段传递给IP层,从而将它们转换为IP数据包,再次采用的方式你无法控制。

当套接字接收缓冲区中没有数据时,

WSARecv()阻塞,并且当套接字接收缓冲区中的所有数据都已传输到应用程序时返回,直到应用程序提供的限制为止。这可能只是一个再见,或整个应用程序缓冲区,或介于两者之间的任何东西,完全取决于收到的粒度。

所有这些都是指阻止模式。非阻塞模式类似,只是有错误返回而不是上面的块。