多端口监听套接字linux
Posted
技术标签:
【中文标题】多端口监听套接字linux【英文标题】:multiport listening socket linux 【发布时间】:2012-09-26 06:38:34 【问题描述】:我正在用 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 端口从同一服务器寻求服务的客户端)
【问题讨论】:
这正是select
的设计目的。 (还有poll
、epoll
、kqueue
等)你试过阅读select
手册页吗?
【参考方案1】:
你完全误解了套接字和端口,这两个是不同的东西。 一个端口可以有多个套接字。但是您可以将您的列表套接字(被动套接字)绑定到一个端口。 在继续之前read this
如果您希望您的应用程序在两个不同的端口上侦听,请绑定两个不同的套接字。
对于快速参考,单个进程中的选择最多只能有 1024 个套接字描述符。 因此,如果您使用的是单进程模型,那么 select 只能处理 1024 个连接。 另请阅读 C10k 问题,看看什么适合您的需要。
【讨论】:
【参考方案2】:如果您的应用程序必须一次从多个套接字接受数据,则使用 select() 非常棒,因为它会阻塞,直到多个套接字中的任何一个准备好数据。 select() 的另一个优点是您可以设置一个超时值,之后无论任何套接字是否为您提供数据,控制权都会返回给您。 以下链接对您有用:http://www.softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/unix-socket-faq-2.html
问题20http://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 在他的answer 中指出的那样。
【讨论】:
以上是关于多端口监听套接字linux的主要内容,如果未能解决你的问题,请参考以下文章