0

让我先说一下我从未使用过 I/O 完成端口,尽管我已经听说过它们很多年了。我的背景主要是select, poll, epoll,WSAEventSelectWaitForMulitpleObjects. 如果我对以下文本中的 I/O 完成端口有根本的误解,请纠正我。

作为工作项目的一部分,我的任务是为模拟开发一个插件 (DLL),它允许客户端连接到插件并通过 TCP 向/从模拟发送/接收数据。该插件充当服务器。该仿真模拟了不同(不是以太网)接口的通信通道,在这个特定的应用程序中,每个通道都有一个套接字是有意义的。我不知道会有多少个客户端,或者每个客户端会打开多少个通道(套接字)。但是,我知道完全有可能超过 64 个,而且不会是一个非常大的数字,最多可能不到一千。

模拟的一个重要方面是插件仅在其函数被调用时才允许工作test_cycle。在每个测试周期中,我需要:

  1. 接受来自客户端的任何新连接
  2. 从套接字接收数据并将其转发到模拟
  3. 从模拟接收数据并将其转发给客户端

由于可能有超过 64 个套接字,我不能(轻松)使用WSAEventSelectWSAWaitForMultipleEvents检查是否可以读取套接字,或者客户端是否已正常终止连接。

所以我想到了另外两种我可以做到这一点的方法。

  1. 让每个套接字都是非阻塞的。每次test_cycle调用时,循环遍历所有套接字,尝试接收每个套接字的最大数据量。

  2. 使用 I/O 完成端口并从套接字发出异步接收。在中,使用设置为的参数test_cycle重复调用,直到指示超时 ( ?)。如果发生接收,请将下一个接收调用推迟到测试周期结束,这样客户端向服务器发送垃圾邮件不会导致我们无限期地循环进入(希望如此)。GetQueuedCompletionStatusdwMilliseconds0WAIT_TIMEOUTtest_cycle

模拟接口不是线程安全的,将数据转发到模拟的处理工作很少,所以我认为 I/O 完成端口有工作线程没有任何好处,它只会做一个锁定并调用模拟 API。但是,不必轮询每个套接字可能会带来更好的性能。

那么对于这种规模的应用程序,最多少于 1000 个套接字,通常少于 100 个,使用 I/O 完成端口增加的复杂性是否有任何真正的好处?

4

1 回答 1

0

我认为您可以这样做:
1)构建一个侦听器线程。对于每个连接,都会将套接字的副本发送到线程池;
2)建立线程池来处理请求;

我使用管道在线程之间进行传输,而不使用 I/O 完成端口,并且性能非常出色。

把控制限制,以确保资源不枯竭。

于 2014-09-25T14:46:14.430 回答