IOCP:无字节复制的通知

IOCP:无字节复制的通知,c,winsock,iocp,C,Winsock,Iocp,我有一个IOCP应用程序,它在每个套接字上下文中存储一个64kb的缓冲区。它使用大量RAM,同时处理数千个插槽。与此相反,我想切换到每个iocp线程上下文有64kb缓冲区的模型(就像我可以在epoll和kqueue中做的那样)。为此,我需要我的完成端口能够接收通知,而无需将字节复制到提供的WSABUF,并且在收到通知后只需调用异步WSARecvFrom(无需提供重叠结构,我使用udp进行测试),直到收到WSAEWOULDBLOCK。我已经读到,如果我为具有重叠结构的WSARecvFrom调用提供

我有一个IOCP应用程序,它在每个套接字上下文中存储一个64kb的缓冲区。它使用大量RAM,同时处理数千个插槽。与此相反,我想切换到每个iocp线程上下文有64kb缓冲区的模型(就像我可以在epoll和kqueue中做的那样)。为此,我需要我的完成端口能够接收通知,而无需将字节复制到提供的WSABUF,并且在收到通知后只需调用异步WSARecvFrom(无需提供重叠结构,我使用udp进行测试),直到收到WSAEWOULDBLOCK。我已经读到,如果我为具有重叠结构的WSARecvFrom调用提供空WSABUF(buf=NULL,len=0),那么可以实现以下技术。但它不起作用:IOCP永远不会“唤醒”,因为缓冲区太小


还有其他方法可以使这种情况成为可能吗?

这对TCP很有效,是避免“锁定页面”限制的好方法,这在早期版本的windows上是一个大问题,但现在似乎不是什么问题。它应该适合你的情况

我有一组IOCP示例代码,可以是,它支持“零字节读取”和后续异步读取(也就是说,只有在使用零字节缓冲区的读取完成后,才会发出带有缓冲区的重叠读取),我的最新代码支持零字节读取完成后的同步和异步读取

请注意,如果您正在处理TCP,您提到您正在使用UDP“进行测试”,那么您可以通过只对每个连接发出一个重叠读取来实现“单缓冲区”。一旦读取完成,您就可以在使用相同的缓冲区发出新的重叠读取之前处理它


如果您需要处理数千个并发连接,而这些连接很少发送数据,那么“零字节读取”仍然很有用,因为它将一次锁定的页面数减少到最小。使用它来减少内存使用量只需要在“零字节读取”完成后为连接分配一个缓冲区。

谢谢您的回复。但是UDP呢?我的应用程序同时处理TCP和UDP连接,我希望有一个单一的体系结构。是否可以使用UDP?我还没有尝试使用UDP。我预计I/O将以“更多数据”错误完成,您将无法获取其余的数据报。您真的希望UDP数据报达到64K吗?我假设您没有经过任何路由器,这是一个直接的本地连接?对于“零字节读取”,I/O永远不会完成。如果我放入1字节缓冲区,它也永远不会完成。然而,如果我把64k缓冲区,它的工作很好。最大UDP数据报大小是64k,所以是的,我期待这样的数据报。我正在本地主机上进行测试,但我的应用程序当然可以在Internet上运行奇怪的是,它永远不会完成,尽管我看到了IOCP和UDP的其他“问题”(尽管只有在启用“文件跳过”\u“完成”\u“端口成功”时(请参阅).IMHO建议您阅读以下内容:关于通过internet发送大型UDP数据报。我希望您可能会发现,由于数据包丢失,此类大型数据报非常不可靠。libuv似乎在UDP套接字上进行零字节接收。他们的诀窍是使用
MSG_PEEK
标志,以便零字节接收不会消耗数据正在等待的数据包。