- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个多协议(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/
我正在设计客户端-服务器应用程序。我的服务器将使用 C++ 并使用 IOCP 进行 TCP/IP 通信。 尚未决定用于客户端开发的技术。所以我对 IOCP 与将来要开发的客户端的兼容性有几个问题(我需
我有经典的 IOCP 回调,它以这种方式使 i/o 挂起的请求出列、处理它们并释放它们: struct MyIoRequest { OVERLAPPED o; /* ... other params
我有 IOCP 应用程序,每个套接字上下文存储 64kb 缓冲区。它使用大量 RAM,同时处理数千个套接字。相反,我想切换到每个 iocp 线程上下文有 64kb 缓冲区的模型(就像我可以在 epol
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
正在学习IOCP,根据这个article : To begin using completion ports we need to create a Completion Port which in
我一直在脑海中传递一些关于如何在保持 KISS 的同时使用 IO 类型的架构实际包含大量连接的想法。通过网络上的示例,似乎大多数人都使用带有 CONTAINING_RECORD 的双/单链表。而且,作
我想了解为什么使用 IOCP。我可以想到两个原因: 因为 WSARecv() 不会阻塞,所以我可以处理 1000 个客户端,而不必为每个客户端创建一个新线程(另外,您可以创建的线程数量是有限制的,因此
我最近在 windows 平台上遇到了一个叫做 IOCP 的东西,更准确地说:输入/输出控制端口。这似乎是最有效的编写服务器软件代码的方式,因为它需要同时容纳数千名用户。(如果我错了请纠正我,但是每个
到目前为止,我发现的所有示例要么只能读取或写入,要么是 10000 行的巨兽,我什至不知道从哪里开始了解它们的工作原理。 为了测试我的代码,我将浏览器指向我的服务器并发送了一个简单的 http 请求。
我应该读取前 9 个字节,其中应包括数据包的协议(protocol)和传入大小。 当完成端口返回 9 个字节时哪个更好? (性能/良好实践或美学方面) 在套接字上发送另一个重叠读取,这次使用数据包的大
据我了解Windows Server 2003/2008和C++编程下的IOCP,它们或多或少是服务多个套接字(而不是选择)或将多个线程 bundle 在一起以服务那些请求的最高性能方式。 但是,如果
我正在构建 IOCP/RIO Winsock 服务器,并且当客户端触发我的 AcceptEx() 调用时,一直在努力从完成端口获取正确的通知要求。 当我在发送客户端请求后调用 GetQueuedCom
因此,我构建了一个高度多线程的并发应用程序,它管理自己的工作线程(因为它们在整个应用程序生命周期内运行)。现在我使用 SocketAsyncEventArgs 进行网络连接,它在后台使用 I/O 完成
当我调用 BeginExecuteReader (SQL) 时,它是否使用 IO 完成端口?是什么让它成为异步的?我应该从 Begin[Operation]() 还是从 IAsyncResult 构造
这是Microsoft Windows 网络编程 的代码片段: ... // Determine how many processors are on the system. GetSystemInf
如果 FILE_SKIP_COMPLETION_PORT_ON_SUCCESS 未启用,那么即使操作立即成功完成,我仍然会在完成端口上收到完成通知。我想知道如果它也立即完成并出现错误,是否属于这种情况
我正在创建一个客户端程序,它与通过 LAN 连接到我的 PC 的设备进行通信。 我的程序和设备之间典型的通信如下: Program -> Device 1616000D 08 02 00 00
我读到传递给 CreateIoCompletionPort() 函数的 NumberOfConcurrentThreads 参数的理想数字是 0,它将转换为核心数。 但是,我实际应该创建多少个等待完成
我正在为从桌面客户端到浏览器的视频流编写 IOCP 服务器。双方都使用 WebSocket 协议(protocol)来统一服务器的架构(并且因为浏览器没有其他方式可以执行全双工交换)。 工作线程是这样
我可以找到大量关于启动 IOCP 服务器的文章,但没有一篇是关于正确关闭它的 =/ 完成后关闭服务器的正确方法是什么?更具体地说,我已经使用 PostQueuedCompletionStatus()
我是一名优秀的程序员,十分优秀!