gpt4 book ai didi

winsock - 在多协议(protocol) IOCP 套接字服务器上处理接受的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-04 00:39:35 25 4
gpt4 key购买 nike

我正在开发一个多协议(protocol)套接字服务器,在我第一次尝试时,我将其设为事件驱动,因为这是我所知道的最好方式,但是通过使用这种方法,我无法找到链接应用程序特定数据的有效方式到套接字,所以在每个事件上我都必须执行搜索以便将套接字链接到它的上下文。经过一些研究,我发现 IO 完成端口是完成这项工作的更好方法,因此在大量阅读之后,我终于能够重新编写我的代码以在 IOCP 方法下工作。

然而,经过进一步研究后,我发现了这个 article (请阅读:“Accepting Connections”)建议通过在不同线程上处理 FD_ACCEPT 事件来将接受操作与 I/O 过程分离,他还建议将此作为防止恶意攻击的手段......解释确实使有意义,但作者没有考虑到在这种方法下没有办法(至少 AFAIK)将套接字与其上下文数据链接起来,因此在服务器上应用此建议,该服务器监听绑定(bind)到多个地址的多个端口,每个端口处理不同的协议(protocol),必然涉及对每个 FD_ACCEPT 事件的搜索操作,这可能会(也可能不会)打败最初的解耦接受的提议……这就是我首先迁移到完成端口的原因。

所以..我想知道是否有 2 个完成端口,一个用于接受操作,一个用于 I/O 过程,在一般热力学中是否可以被认为是一种好的做法,但特别是在性能方面......或者最好有只有一个?

更新:

经过一些实验,我发现,通过使用 2 个 IOCP(在单独的线程上)将接受过程与 I/O 过程分离是根本不切实际的,并且由于这个事实,无法获得效率提升。所以,即使他没有明确提到它,作者是对的,分离这两个过程的唯一实用方法是处理 FD_ACCEPT 事件,但如果他在他的陈述中也是正确的,那么唯一在我的例子中让它可行的方法是找到一种有效的方法将每个套接字链接到它的上下文数据,或者换句话说;无需搜索,所以原来的问题仍然存在。

最佳答案

如果您将 IOCP 用于数据流,那么通常最好使用 IOCP 来接受新连接,因此使用 AcceptEx()是个好主意。不要担心处理的复杂性,也使用它从对等方读取第一 block 数据,这很难避免潜在的拒绝服务攻击,这对大多数服务器设计来说性能提升可以忽略不计。只需将它用作重叠的 Accept,这样您就不必为每个端口设置一个单独的 Accept 线程,因此可以很好地扩展。

就我个人而言,我从未使用过您链接到的文章所建议的 FD_ACCEPT 想法。完成后只需发布一个新的 AcceptEx 并在开始时发布一个可配置的数字。这样,您将始终有“X”个未决接受。

我有一些文章和示例代码here这可能会有所帮助。

关于winsock - 在多协议(protocol) IOCP 套接字服务器上处理接受的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20616127/

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