我在C(linux)中编写一个multithreading的服务器应用程序,它必须监听两个不同的端口号,比如监听端口号3000和4000,连接不同的客户端以提供不同的function(实际的function由一个工作者执行线程,主线程无限期地运行,并在新的连接上产生新的工作者)。 我不确定select是否会在这里工作,因为我们可以有多个套接字连接,但都与相同的端口号相关联。 我试着依次绑定到sock_1和sock_2。 当我运行client_1时,一切都按预期工作。 但是,当我运行client_2时,在客户端的connect()上出现错误。 如果select()可以在这里使用,请让我知道如何做到这一点。 任何帮助非常感谢! 谢谢 !
(PS sock_1表示端口号3000,sock_2表示4000号端口,client_1表示从3000端口寻求服务的客户端,client_2表示客户端从4000号端口向同一服务器寻求服务)
你完全误解了套接字和端口,这两个是不同的东西。 一个端口可以有多个套接字。 但你可以绑定你的列表套接字(被动套接字)只有一个端口。 在进一步阅读之前
如果您希望您的应用程序在两个不同的端口上侦听,您是否需要将两个不同的套接字绑定在一起。
对于快速引用,单个进程中的选择最多只能有1024个套接字描述符。 所以如果你使用一个单独的进程模型,那么一个select只能处理1024个连接。 另外阅读C10k的问题,看看有什么适合你的需要。
如果您的应用程序必须一次接受来自多个套接字的数据,那么使用select()会很好,因为它将阻塞,直到有多个套接字中的任何一个套接字准备好数据为止。 select()的另一个好处是你可以设置一个超时值,在这之后,控制权将被返回给你,无论你的套接字是否有数据。
以下链接对您有用:
http://www.softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/unix-socket-faq-2.html
第6章:我理解你的应用程序'不需要select()'看看下面的链接代码: http : //kturley.com/simple-multi-threaded-web-server-written-in-c-using -pthreads /
在代码中为不同的端口调用两个不同的bind()? 正如@Rahul Gautam在他的回答中指出的那样。