多端口监听套接字linux

时间:2012-10-05 06:20:21

标签: c linux sockets port

我正在编写一个多线程服务器应用程序,在C(linux)中,必须侦听2个不同的端口号,比如侦听端口号3000和4000,用于连接到它的不同客户端以提供不同的功能(实际执行功能)通过工作线程,主线程无限期地运行并在新连接时产生新工作者。我不确定select是否可以在这里工作,因为我们可以有多个套接字连接,但都与相同的端口号相关联。我尝试顺序绑定到sock_1和sock_2。当我运行client_1时,一切都按预期工作。但是,当我运行client_2时,我在客户端的connect()上收到错误。如果可以在这里使用select(),请告诉我如何操作。任何帮助非常感谢!谢谢!

(P.Sock_1指的是端口号3000,sock_2指的是端口号4000,client_1指的是从端口3000寻求服务的客户端,而client_2指的是从4000端口向同一服务器寻求服务的客户端)

2 个答案:

答案 0 :(得分:6)

你完全误解了socket和port,这两个是不同的东西。 端口可以​​有多个套接字。但您可以将列表套接字(被动套接字)绑定到仅一个端口。 在进一步read this 之前

如果您希望应用程序在两个不同的端口上侦听,请使用它绑定两个不同的套接字。

对于快速参考,单个进程中的select只能有1024个套接字描述符。 因此,如果您使用的是单个流程模型,那么select只能处理1024个连接。 另请阅读C10k问题,看看哪些适合您的需求。

答案 1 :(得分:3)

如果您的应用程序必须一次接受来自多个套接字的数据,那么使用select()是很好的,因为它将阻塞,直到许多套接字中的任何一个已准备好数据。 select()的另一个好处是你可以设置一个超时值,之后控制权将返回给你,无论任何套接字是否有你的数据。
以下链接对您有用:
   http://www.softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/unix-socket-faq-2.html

问题-20
   http://www.scribd.com/doc/7296598/Unix-Network-Programming-Volume-I-The-Sockets-Networking-API-3rd-Edition

第6章:我理解您的应用程序'不需要选择()'查看以下链接中的代码:http://kturley.com/simple-multi-threaded-web-server-written-in-c-using-pthreads/

为代码中的不同端口调用两个不同的bind()?正如@Rahul Gautam在answer中所指出的那样。