我有一些关于WSARecv的问题
问题1:
如何准确确定我们必须为WSABUF.len
指定的大小?
问题2: WSARecv是否读取长度为0的数据?
例如。
WSABUF.len = 0
我想用它来确定是否发送了所有数据包。
问题3:
如果我理解正确,lpNumberOfBytesRecvd
保存实际读取的字节数而不是WSABUF.len
,是否正确?
感谢。
答案 0 :(得分:6)
1)WSABUF.len
是您提供的缓冲区的长度。这是此次通话中可以读取的最大金额。您知道此大小,因为它是您为WSABUF.buf
指向的缓冲区分配的内存大小。
2)在具有数千个并发连接的某些高性能情况下,使用异步I / O时,您可以将WSABUF.len
值设置为0,以防止读取除了完成之外的任何操作,告诉您数据是可用。这是一种很少需要的性能调整,通常被称为“零字节读取”。它有用的原因是它意味着I / O系统不需要将读缓冲区锁定在内存中(没有读缓冲区),因此这减少了锁定的I / O页数。可以锁定的I / O页面数量有一个固定的限制,因此当您有数千个连接但它们不经常发送数据时,这可能很有用。您在所有连接上发布零字节读取,然后在零字节读取完成时发布实际读取,并且您知道您有可用数据。
3)是的。实际读取的字节数通过lpNumberOfBytesRecvd
单独返回。
您应该考虑一下消息框架(我会谈到here和here,因为这可以帮助您了解您希望在给定时间从连接中读取多少数据。< / p>