gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:50:26 28 4
gpt4 key购买 nike

我正在 Windows 上编写 TCP 服务器/客户端应用程序,以熟悉 Winsock API。我有 UNIX 背景,想知道以下哪种方法是实现应用程序的最佳方法:

首先是规范

  • 必须能够在多处理器和单处理器系统上很好地扩展。
  • 没有硬件连接限制。
  • 应用程序既可以监听连接,充当服务器,也可以充当客户端。
  • 多线程。

第一种方法:

  • 在“服务器”线程中用于监听的非阻塞类选择套接字。
  • 我们为每个连接的客户端生成一个单独的线程。

第二种方法:

  • 在“服务器”线程中阻塞用于监听的套接字。
  • 我们为每个连接的客户端生成一个单独的线程。

第三种方法:

  • 在“服务器”线程中用于监听的非阻塞类选择套接字。
  • 每个传入连接都没有单独的线程,我想协议(protocol)需要跨 session 保存状态信息。

我想知道什么是最有效和可扩展的方法,尤其是它是否也可以与 UDP 套接字一起使用。

注意:我正在用普通的旧 C 编写应用程序。不涉及 .NET 或 C++,C++ 异常也被禁用。

最佳答案

正如 Gary 所说,I/O 完成端口是在 Windows 平台上以非阻塞/异步方式管理多个网络连接的最有效方式。

使用 IOCP,您会在网络操作完成时收到通知,并且您可以使用少量线程处理这些完成。您可以决定分配多少线程来处理完成,内核决定何时使用您提供的线程。它以 LIFO 顺序使用它们,以减少上下文切换,因此,如果您只使用在任何时候所需的最少线程数,并且您正在重用相同的线程,而不是循环遍历您可用的所有线程使用。

IOCP 编程的异步特性一开始可能有点令人困惑,但一旦掌握了它,就会相当简单。

我有一些免费的 IOCP 服务器代码,它演示了基础知识并提供了一些非常容易构建的示例服务器。您可以在此处找到代码:http://www.serverframework.com/products---the-free-framework.html .该页面还链接到我写的一些解释代码的文章。

将此与您的问题的详细信息相关联。您应该查看第三种方法的变体。使用 AcceptEx()接受新连接,这可以以异步方式使用,因此您不需要单独的线程来接受连接,并且可以使用同时处理重叠/异步读写操作的线程。

关于c - Windows 上多线程应用程序中非阻塞服务器/监听套接字的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5849008/

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