2009-09-27 45 views
3

首先,我不太了解网络编程...多个端口的多个线程?

因此,我有一个程序(进程)需要监听3个端口...两个是TCP和另一个UDP。

两个TCP端口将要接收大量的数据,每隔一段时间(可以是少至每5分钟或频率高达每20秒)。第三个(UDP)端口正在接收不变的数据。现在,让这些在不同的线程上进行监听是否有意义?

举例来说,当我收到的TCP端口的一个数据量很大的,我不希望我的UDP流中断做......是网络编程这些共同关心的问题?

谢谢你们......如果我不清楚,请随时提出澄清问题。

我将在Windows上使用Boost库,如果它有任何方位。

编辑:再次看完这个,我才意识到我不是问一个具体问题哈哈...我想我只是在寻找对这个问题的一些想法/主意/指导,以及如何管理多个连接。谢谢

+1

我建议你遵循的一个的意见“助推:ASIO /选择/ Windows的完成端口API”和“线程池”的答案(和标记为正确)。请注意,对于您的应用程序,每个端口执行1个线程是最简单的实现。虽然你可能会说今天你永远不会需要超过4-6个套接字,但有一天你可能需要这个应用程序来扩展到更多的套接字。所以你可能会救自己(或跟随你的人)在今天使用线程池来解决问题。 – jmucchiello 2009-09-27 06:04:02

+0

对这个问题的回答有点令人生气。每个人似乎都认为你想建立一个Web服务器。我不知道答案(这就是为什么这只是一个评论),但我怀疑,如果UDP流的吞吐量很高,并且您希望避免丢弃UDP数据包,那么您确实希望它能够运行在不同的处理器上。 – 2011-01-20 20:37:08

回答

5

通常,除非必要,否则应避免线程。在现代机器上,使用单线程和使用I/O准备就绪/完成功能可以获得更好的性能。在Windows上,这是IO完成端口,在Mac OS X和FreeBSD上:kqueue(2),在Solaris上:事件端口,在Linux epoll上,在VMS QIO上。等等

在boost中,这个被boost :: asio抽象出来。

其中螺纹将是有益的地方是,你必须做显著处理或者执行阻塞操作系统调用,将不可接受的延迟增加了网络处理的其余部分。

+1

这是错误的。如果您尝试使用单个线程来处理多个套接字,您将会遇到可怕的表现。 – 2009-09-27 02:27:08

+4

垃圾!当你扩大套接字的数量时,如果每个套接字有一个线程,性能将显着下降。这种架构有很多例子,包括大多数现代Web服务器。对于更老的,众所周知的检查,请参阅:http://www.kegel.com/c10k.html 您是否真的试图扩展这些东西? – janm 2009-09-27 02:31:08

2

使用线程,每个接收连接一个,将有助于保持吞吐量高,并防止一个端口的数据阻止其他端口的处理。

这是一个好主意,特别是因为你只谈论3个连接。产生三个线程来处理通信将使您的应用程序更容易维护并保持高性能。

1

首先,

...是网络编程这些共同关心的问题?

是的,线程问题是网络编程非常普遍的关注。

其次,使用三个线程监听三个不同的端口的设计理念会工作,可让您同时在所有三个端口上侦听。正如评论中指出的那样,这不是唯一的方法。

最后,一个设计,就是在网络编程常见的是有一个线程监听的连接,然后生成一个新的辅助线程来处理处理连接。最初的侦听器线程只是将套接字连接传递给助手,然后再回到侦听新连接。

+2

您不需要多个线程来侦听不同的端口。使用select()或等价物等待所有侦听套接字上的输入事件。 – karunski 2009-09-27 02:31:14

+0

是select()的东西来自Boost?如果没有,你能指向我的这个功能的文档,所以我可以找到一个提升equiv?谢谢karunski – Polaris878 2009-09-27 02:39:21

+0

选择来自您的操作系统。在boost中,请参阅在其实现中使用select(如果适用)的asio库。 – janm 2009-09-27 02:41:32

1

多个线程不能缩放。操作系统线程在数千或数万个连接的规模上过重。当然,你只有3个,所以没什么大不了的。事实上,如果您确定您的应用程序不需要扩展,我甚至可以以简单的名义推荐它。

但是在规模上,你会想要使用select()/poll()/epoll()/libevent/etc。在现代Linux系统上,epoll()是迄今为止最强大,速度最快的。一个线程同时轮询所有套接字上的套接字准备就绪,然后,准备就绪的套接字或者由单线程立即处理,或者更多时候是交给线程池。线程池具有有限数量的线程(通常是本地计算机上可用计算核心的数量的一定比例),其中在套接字准备就绪时可以获取空闲线程。

同样,您可以为每个连接使用一个线程,但如果您有兴趣学习构建可伸缩网络系统的正确方法,请不要。构建一个select()/ poll()风格的服务器是一个非常棒的学习体验。

仅供参考,请参阅C10K问题:

http://www.kegel.com/c10k.html

+1

它可能扩展到4或5个连接...最多6个。这个应用程序是相当具体的使用。感谢您的提示! – Polaris878 2009-09-27 02:53:21