3

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

(PS sock_1 指 3000 端口,sock_2 指 4000 端口,client_1 指客户端从 3000 端口寻求服务,client_2 指客户端从 4000 端口从同一服务器寻求服务)

4

2 回答 2

7

您完全误解了套接字和端口,这两个是不同的东西。一个端口可以有多个套接字。但是您可以将您的列表套接字(被动套接字)绑定到一个端口。在进一步阅读此内容之前

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

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

于 2012-10-05T07:12:50.557 回答
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 在他的回答中指出的那样。

于 2012-10-05T06:36:58.300 回答