首先,我不太了解网络编程......
因此,我有一个程序(进程)需要监听3个端口......两个是TCP,另一个是UDP。
两个TCP端口每隔一段时间就会接收大量数据(可能只有每5分钟一次或每20秒一次)。第三个(UDP)端口正在接收常量数据。现在,将这些监听到不同的线程是否有意义?
例如,当我从其中一个TCP端口收到大量数据时,我不希望我的UDP流中断......这些是网络编程的常见问题吗?
谢谢你们......如果我不清楚,请随时提出澄清问题。
如果有任何影响,我将在Windows上使用Boost库。
编辑:再次阅读本文后,我意识到我不是在问一个具体的问题大声笑......我想我只是在寻找关于这个问题的一些想法/想法/指导以及如何管理多个连接。感谢
答案 0 :(得分:5)
通常,除非必要,否则请避免使用线程。在现代机器上,通过使用单个线程并使用I / O就绪/完成功能,您将获得更好的性能。在Windows上,这是IO完成端口,在Mac OS X和FreeBSD上:kqueue(2),在Solaris上:事件端口,在Linux epoll上,在VMS QIO上。等
在boost中,这是由boost :: asio抽象的。
线程有用的地方是必须进行重要处理或执行阻塞操作系统调用的地方,这会给网络处理的其余部分增加不可接受的延迟。
答案 1 :(得分:2)
使用线程,每个接收连接一个,将有助于保持高吞吐量并防止一个端口的数据阻止其他端口的处理。
这是一个好主意,特别是因为你所说的只有3个连接。产生三个线程来处理通信将使您的应用程序更容易维护并保持高性能。
答案 2 :(得分:1)
首先,
......这些是网络编程的常见问题吗?
是的,线程问题是网络编程中非常常见的问题。
其次,您使用三个线程在三个不同端口上进行侦听的设计理念可行,允许您同时侦听所有三个端口。正如评论中指出的那样,这不是唯一的方法。
最后,网络编程中常见的一种设计是让一个线程监听连接,然后生成一个新的帮助程序线程来处理连接。原始侦听器线程只是将套接字连接传递给助手,然后再回到侦听新连接。
答案 3 :(得分:1)
多线程无法扩展。操作系统线程在数千或数万个连接的规模上太重了。当然,你只有3,所以没什么大不了的。事实上,如果您确定您的应用程序不需要扩展,我甚至可能会以简单的名义推荐它。
但是在规模上,你想要使用select()/poll()/epoll()/libevent/etc
。在现代Linux系统上,epoll()是目前最强大的,速度极快。一个线程同时轮询所有套接字上的套接字就绪状态,然后信号为就绪的套接字由单个线程立即处理,或者通常不会传递给线程池。线程池具有有限数量的线程(通常是本地计算机上可用的计算核心数的一定比例),其中每当套接字准备好时都会抓取一个空闲线程。
同样,您可以为每个连接使用一个线程,但如果您有兴趣了解构建可扩展网络系统的正确方法,请不要这样做。构建select()/ poll()样式服务器是一种非常棒的学习体验。
供参考,请参阅C10K问题: