【问题标题】:c linux multithreading networkingc linux 多线程网络
【发布时间】:2012-06-29 14:46:12
【问题描述】:

我在网关上有一个网络应用程序。它接收和发送数据包。对于大多数人来说,我的网关充当路由器,但在某些情况下,它也可以接收数据包。

我应该有:

  • 只有一个主线程
  • 一个主线程 + 一个调度线程,负责将其提供给正确的流处理程序
  • 线程数与流数一样多
  • 别的东西。

?

【问题讨论】:

  • 如果您不想学习 Unix 网络编程(如果您不想自己编写代码),您可以使用一些 lib 来提供帮助。看看 ENet (enet.bespin.org)。你可以在这里阅读更多关于它的信息:linuxjournal.com/content/network-programming-enet(来自文本:这意味着你不必担心为了处理多个连接而对 connect() 和 accept() 进行分叉、预分叉、线程或非阻塞调用的复杂性.)

标签: c linux multithreading networking


【解决方案1】:

正确执行多线程并非易事,在许多情况下,基于selectfriends 的解决方案将更容易创建。

【讨论】:

  • selectfriends based?那些是什么?
  • 根据问题的输入,这绝对是要走的路。
【解决方案2】:

您的情况听起来很像典型的 Unix 服务守护进程。解决您的问题的流行解决方案不是使用线程,而是使用分叉。

这个想法是您的程序侦听套接字并等待连接。一旦连接到达,它就会分叉。然后子进程继续处理连接。父进程本身只是继续循环并等待传入​​的连接。

相对于线程的优势:

  • 非常简单的程序设计
  • 没有并发问题
  • 为 Unix/Linux 系统建立的方法

缺点:

  • 当多个连接相互交互时,事情会变得复杂(您的用例听起来不像)
  • Windows 系统上的性能损失(不是 Unix 系统上的!)

你可以在网上找到很多代码示例。

【讨论】:

  • +1 但如果不同的连接伙伴需要交换信息,则分叉将是一个问题,因为打开的套接字将存在于不同的进程中。
  • 是的,我只是将其添加到答案中。 :)
【解决方案3】:

我对网络应用了解不多,但我觉得是这样的:

  • 如果您能够对请求做出异步反应,您可能只使用一个线程(如在 Node.JS 中)。如果您无法异步响应,主线程将始终阻止其他操作。
  • 如果您无法对请求做出异步反应,则必须使用多个线程。但是您可以通过多种不同的方式来实现这一点:您可以为每个请求创建一个线程,或者创建有限数量的线程,然后将它们分配给您的请求。

【讨论】:

    【解决方案4】:

    我个人的偏好是每个连接使用一个主线程和一个工作线程。没有任何上限。我假设您的服务器将像 HTTP 服务器一样是无状态的。

    对于有状态的服务器,您必须想办法控制线程数。

    【讨论】:

      猜你喜欢
      • 2010-09-13
      • 2016-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      相关资源
      最近更新 更多