2012-06-29 46 views
4

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

我应该有:

  • 只有一个主线程
  • 一个主线程+负责给它正确的流处理器
  • 尽可能多的线程调度线程,因为有流动
  • 别的东西。

+2

如果你不想学习Unix网络编程(如果它不是你的意图并编写自己的代码),你可以使用一些库的帮助。看看ENet(http://enet.bespin.org/)。您可以在这里阅读更多关于它的信息:http://www.linuxjournal.com/content/network-programming-enet(来自文本:这意味着您不必担心分叉,预编译,线程或非阻塞调用的复杂性连接()和接受()以处理多个连接。) –

回答

2

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

+0

'select'和'based based'?那些是什么? – nullpotent

+0

@AljoshaBre请参阅编辑 – fvu

+0

这绝对是基于来自问题的输入的方式。 –

1

我不知道很多关于物联网应用,但我认为是这样的:

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

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

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

优势在穿线:

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

缺点:

  • 事情变得复杂,当几个连接彼此交互(你的使用情况听起来并不像他们会)
  • 性能损失在Windows系统上(而不是在Unix系统!)

你可以找到许多代码示例在线。

+0

+1,但如果不同的连接伙伴需要交换信息,分叉将成为问题,因为开放套接字将存在于不同的进程中。 – fvu

+0

是的,我只是将其添加到答案中。 :) – ypnos

0

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

对于有状态的服务器,你将不得不找出一些方法来控制线程数量。