多端口监听套接字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 的设计目的。 (还有pollepollkqueue 等)你试过阅读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的主要内容,如果未能解决你的问题,请参考以下文章

linux环境apache多端口配置虚拟主机的方法深入介绍

如何使用Win7设置QTcpServer单独监听端口

linux如何查看开启端口

linux使用啥命令查看端口 ?

linux系统实现多个进程监听同一个端口

Linux如何查看端口状态