我正在测试大缓冲区,我在WSABUF中设置它并接下来调用WSASend()
。
但是,WSARecv()
只是一次性将它传回那个大缓冲区。
这有意义吗?
对于大缓冲区,WSASend()
和WSARecv()
的限制在哪里?
似乎批处理正在后台进行,所有这些都隐藏在抽象之后。
如果是这种情况,我希望这一切都会发生在我的应用程序中。
答案 0 :(得分:2)
限制分别是套接字发送和接收缓冲区大小。
套接字发送缓冲区已满时 WSASend()
阻塞,并且当所有内容都已传输到套接字发送缓冲区时返回。同时,异步,TCP正在从套接字发送缓冲区中删除数据,以一种你无法控制的方式将其转换为TCP段,并将这些段传递给IP层,从而将它们转换为IP数据包,再次采用的方式你无法控制。
WSARecv()
阻塞,并且当套接字接收缓冲区中的所有数据都已传输到应用程序时返回,直到应用程序提供的限制为止。这可能只是一个再见,或整个应用程序缓冲区,或介于两者之间的任何东西,完全取决于收到的粒度。
所有这些都是指阻止模式。非阻塞模式类似,只是有错误返回而不是上面的块。