2012-10-05 141 views
3

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

(PS sock_1指端口没有3000和sock_2指端口没有4000,的Client_1指客户多数民众赞成从端口3000和client_2的寻求服务是指从来自端口号4000相同的服务器客户端寻求服务)

+2

这正是'select'设计的目的。 (和'poll','epoll','kqueue'等等)你有没有试过阅读'select'手册页? –

回答

6

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

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

对于快速参考,单个进程中的选择最多只能有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:我明白你的应用程序不需要选择()'有在以下链接代码看看:http://kturley.com/simple-multi-threaded-web-server-written-in-c-using-pthreads/

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