在Windows上的多线程应用程序中非阻塞服务器/监听套接字的最佳方法?

| 我正在Windows上编写TCP服务器/客户端应用程序,以熟悉Winsock API。我来自UNIX,并且想知道以下哪一种是实现应用程序的最佳方法: 首先规格 必须在多处理器和单处理器系统上很好地扩展。 没有硬性限制的连接。 应用程序既可以侦听连接,也可以充当服务器,也可以充当客户端。 多线程。 第一种方法: 在\'server \'线程中进行侦听的非阻塞类选择套接字。 对于每个连接的客户端,我们产生一个单独的线程。 第二种方法: 在\'server \'线程中阻塞监听套接字。 对于每个连接的客户端,我们产生一个单独的线程。 第三种方法: 在\'server \'线程中进行侦听的非阻塞类选择套接字。 对于每个传入连接,没有单独的线程,该协议需要在我假设的各个会话之间保存状态信息。 我想知道什么是最有效和可扩展的方法,尤其是它是否也可以与UDP套接字一起使用。 注意:我正在用普通C和旧C编写应用程序。不涉及.NET和C ++,也禁用了C ++异常。     
已邀请:
正如Gary所说,I / O完成端口是在Windows平台上以非阻塞/异步方式管理多个网络连接的最有效方法。 使用IOCP,您可以在网络操作完成时收到通知,并且可以使用少量线程来处理这些完成。您可以决定分配多少个线程来处理补全,而内核则决定何时使用您提供的线程。它以LIFO顺序使用它们,以减少上下文切换,因此,如果您在任何时候仅使用了最少数量的线程,并且正在重用相同的线程,而不是循环使用所有可用线程用来。 IOCP编程的异步特性一开始可能会让人有些困惑,但是一旦掌握了它,就很简单了。 我有一些免费的IOCP服务器代码,这些代码演示了基础知识并提供了一些易于构建的示例服务器。您可以在以下位置找到代码:http://www.serverframework.com/products---the-free-framework.html。该页面还链接到我写的一些解释代码的文章。 与此相关的详细问题。您应该考虑第三种方法的变化。使用AcceptEx()接受新的连接,可以以异步方式使用它,因此您不需要单独的线程来接受连接,并且可以使用正在处理重叠/异步读取和写入操作的线程。     
我已经编写了一个不使用阻塞套接字的异步客户端,因此,如果您对这种方法感兴趣,请看一下我的客户端:http://codesprout.blogspot.com/2011/04/asynchronous- http-client.html 它是一个HTTP客户端,但是我在其中仅显示了很少的HTTP协议处理,它们全都是.NET套接字。服务器将以类似的方式工作:您可以利用* Async方法,例如
AsseptAsync
。     
在Windows下,使用I / O完成调用可获得最佳性能。 这是因为列表和排队机制是在内核中完成的,而不是繁重的用户模式开销(如果您敢于自己进行艰苦的工作,则会拖累代码)。 不幸的是,Windows I / O完成调用需要分配多个线程以进行扩展,这很快就使性能丧失了(与Linux epoll相比,后者可以独立于您决定参与任务的工作线程数进行扩展)。 最近,我发现了一个http://gwan.com/来自Windows的Web服务器,然后将其移植到Linux下。他们的作者在论坛上详细描述了该问题。     

要回复问题请先登录注册