多端口监听套接字 Linux

3
我正在编写一个多线程服务器应用程序,使用 C 语言(Linux),必须监听两个不同的端口号,比如监听端口号为 3000 和 4000,为连接到它的不同客户端提供不同的功能服务(实际功能由工作线程执行,主线程无限运行并在新连接时产生新的工作线程)。我不确定 select 是否适用于此情况,因为我们可以有多个套接字连接,但所有连接都与同一端口号相关联。我尝试依次绑定 sock_1 和 sock_2。当我运行 client_1 时,一切正常。但是,当我运行 client_2 时,在客户端出现 connect() 错误。如果可以在这里使用 select(),请让我知道如何使用。非常感谢任何帮助!谢谢!(P.S sock_1 指的是端口号 3000,sock_2 指的是端口号 4000,client_1 指的是从端口 3000 寻求服务的客户端,client_2 指的是从同一服务器的端口号 4000 寻求服务的客户端。)

2
这正是select的设计目的。(以及pollepollkqueue等)。你尝试过阅读select手册页吗? - Dietrich Epp
2个回答

6
你完全误解了套接字和端口,它们是两个不同的概念。一个端口可以拥有多个套接字,但你只能将你的监听套接字(被动套接字)绑定到单个端口。如果你想让你的应用程序监听两个不同的端口,你需要使用两个不同的套接字进行绑定。快速参考:在单个进程中,select 函数最多只能处理 1024 个套接字描述符。因此,如果你使用单个进程模型,则 select 函数最多只能处理 1024 个连接。还要阅读 C10k 问题,看看哪种方法适合你的需求。请点击这里以获取更多信息。

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章:我理解您的应用程序“不需要select()”。请查看以下链接中的代码:http://kturley.com/simple-multi-threaded-web-server-written-in-c-using-pthreads/

在您的代码中调用了两个不同的bind()来绑定不同的端口吗?如@Rahul Gautam在他的答案中所指出的。


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