C语言的Linux多线程网络编程

4
我有一个网关上的网络应用程序。它接收和发送数据包。对于大多数情况,我的网关充当路由器,但在某些情况下,它也可以接收数据包。
那么我应该选择:
- 只有一个主线程 - 一个主线程+一个调度线程负责将其传递给正确的流处理程序 - 与流的数量一样多的线程 - 其他一些方式。

2
如果您不想学习Unix网络编程(如果这不是您的意图并且自己编写代码),则可以使用一些库来帮助。看看ENet(http://enet.bespin.org/)。您可以在此处阅读更多信息:http://www.linuxjournal.com/content/network-programming-enet(从文本中:这意味着您无需担心分叉,预分叉,线程或非阻塞调用connect()和accept()以处理多个连接的复杂性。) - André A. G. Scotá
4个回答

2

正确地进行多线程编程并不是一件简单的事情,在很多情况下使用基于selectfriends的解决方案会更容易实现。


“select”和“friends based”是什么? - nullpotent
根据问题的输入,这绝对是正确的方法。 - Klaas van Gend

2
你的情况很像一个典型的Unix服务守护进程。解决你问题的流行方案不是使用线程,而是使用fork。
这个想法是你的程序监听套接字并等待连接。一旦有连接到达,它就会分叉。子进程继续处理连接。父进程本身只是在循环中继续等待传入的连接。
优点:
- 程序设计非常简单 - 不会出现并发问题 - Unix/Linux系统上已经成熟的方法
缺点:
- 当几个连接相互交互时,事情变得复杂(你的用例似乎不会) - 在Windows系统上会有性能损失(在Unix系统上不会!)
你可以在网上找到许多代码示例。

+1 但是如果不同的连接伙伴需要交换信息,分叉将成为一个问题,因为开放的套接字将存在于不同的进程中。 - fvu
是的,我刚刚把那个添加到答案中了。 :) - ypnos

1

我对网络应用了解不多,但我认为它是这样的:

  • 如果您有异步响应请求的能力,您可能只使用一个单线程(例如Node.JS)。如果您无法异步响应,则主线程将始终阻塞其他操作。
  • 如果您无法异步响应请求,则必须使用多个线程。但是,您可以通过许多不同的方式实现:您可以为每个请求创建一个线程,或者创建一定数量的线程,然后将它们分配给您的请求。

0

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

对于有状态的服务器,您将不得不想出某种方法来控制线程数量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接