WSARecv和WSABuf问题

时间:2011-02-14 01:40:51

标签: qt winsock

我有一些关于WSARecv的问题

问题1: 如何准确确定我们必须为WSABUF.len指定的大小?

问题2: WSARecv是否读取长度为0的数据?

例如。 WSABUF.len = 0

我想用它来确定是否发送了所有数据包。

问题3: 如果我理解正确,lpNumberOfBytesRecvd保存实际读取的字节数而不是WSABUF.len,是否正确?

感谢。

1 个答案:

答案 0 :(得分:6)

1)WSABUF.len是您提供的缓冲区的长度。这是此次通话中可以读取的最大金额。您知道此大小,因为它是您为WSABUF.buf指向的缓冲区分配的内存大小。

2)在具有数千个并发连接的某些高性能情况下,使用异步I / O时,您可以将WSABUF.len值设置为0,以防止读取除了完成之外的任何操作,告诉您数据是可用。这是一种很少需要的性能调整,通常被称为“零字节读取”。它有用的原因是它意味着I / O系统不需要将读缓冲区锁定在内存中(没有读缓冲区),因此这减少了锁定的I / O页数。可以锁定的I / O页面数量有一个固定的限制,因此当您有数千个连接但它们不经常发送数据时,这可能很有用。您在所有连接上发布零字节读取,然后在零字节读取完成时发布实际读取,并且您知道您有可用数据。

3)是的。实际读取的字节数通过lpNumberOfBytesRecvd单独返回。

您应该考虑一下消息框架(我会谈到herehere,因为这可以帮助您了解您希望在给定时间从连接中读取多少数据。< / p>