同一机器上的两个应用程序可以绑定到相同的端口和IP地址吗?更进一步,一个应用程序可以侦听来自某个IP的请求,而另一个应用程序可以侦听来自另一个远程IP的请求吗? 我知道我可以让一个应用程序启动两个线程(或分支)具有类似的行为,但是两个没有任何共同之处的应用程序也可以这样做吗?


当前回答

是也不是。只有一个应用程序可以在一个端口上进行主动侦听。但是该应用程序可以将其连接遗留给另一个进程。因此,您可以让多个进程在同一个端口上工作。

其他回答

Yes.

从这篇文章中: https://lwn.net/Articles/542629/

新的套接字选项允许同一主机上的多个套接字绑定到同一个端口

答案取决于所考虑的操作系统。总的来说:

对于TCP,没有。同一时间只能有一个应用程序侦听同一端口。现在,如果您有2个网卡,您可以让一个应用程序在第一个IP上侦听,第二个应用程序在第二个IP上侦听,使用相同的端口号。

对于UDP (Multicasts),多个应用程序可以订阅同一个端口。

编辑:自Linux Kernel 3.9及更高版本以来,使用SO_REUSEPORT选项添加了对多个应用程序侦听同一端口的支持。更多信息可以在lwn.net文章中找到。

分享一下@jnewton提到的内容。 我在我的mac上启动了一个nginx和一个嵌入式tomcat进程。我可以看到两个进程都运行在8080。

LT<XXXX>-MAC:~ b0<XXX>$ sudo netstat -anp tcp | grep LISTEN
tcp46      0      0  *.8080                 *.*                    LISTEN     
tcp4       0      0  *.8080                 *.*                    LISTEN   

不。一次只能有一个应用程序绑定到一个端口,强制绑定时的行为是不确定的。

使用多播套接字(听起来与您想要的相距甚远),只要在每个套接字的选项中设置SO_REUSEADDR,就可以有多个应用程序绑定到一个端口。

您可以通过编写一个“主”进程来实现这一点,该进程接受并处理所有连接,然后将它们交给需要侦听同一端口的两个应用程序。这是Web服务器等采用的方法,因为许多进程需要侦听80。

除此之外,我们将讨论细节——您同时标记了TCP和UDP,是哪个?还有,什么平台?

肯定是的。据我所知,从内核版本3.9(不确定版本)开始,就引入了对SO_REUSEPORT的支持。SO_RESUEPORT允许绑定到完全相同的端口和地址,只要第一个服务器在绑定套接字之前设置了这个选项。

它适用于TCP和UDP。有关更多详细信息,请参阅链接:SO_REUSEPORT