gpt4 book ai didi

c - IOCP:没有字节复制的通知

转载 作者:行者123 更新时间:2023-11-30 14:25:10 25 4
gpt4 key购买 nike

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

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

最佳答案

这对于 TCP 来说效果很好,并且是避免“锁定页面”限制的好方法,“锁定页面”限制在早期版本的 Windows 上是一个大问题,但现在似乎不是什么问题了。它应该适合您的情况。

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

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

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

关于c - IOCP:没有字节复制的通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10635976/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com