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


当前回答

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

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

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

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

其他回答

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

如果你所说的应用程序是指多个进程,那么是,但通常不是。 例如Apache服务器在同一个端口上运行多个进程(通常是80)。它通过指定一个进程实际绑定到端口,然后使用该进程向接受连接的各个进程进行切换来实现。

在创建TCP连接时,您要求连接到特定的TCP地址,该地址是IP地址(v4或v6,取决于您使用的协议)和端口的组合。

当服务器监听连接时,它可以通知内核它想监听特定的IP地址和端口,即一个TCP地址,或者在每个主机的IP地址(通常用IP地址0.0.0.0指定)上的相同端口,这实际上是在监听许多不同的“TCP地址”(例如,192.168.1.10:8000,127.0.0.1:8000等)。

不,您不能让两个应用程序侦听同一个“TCP地址”,因为当消息传入时,内核如何知道该将消息传递给哪个应用程序?

然而,在大多数操作系统中,您可以在单个接口上设置多个IP地址(例如,如果在一个接口上有192.168.1.10,如果网络上没有其他人使用它,则还可以设置192.168.1.11),在这些情况下,您可以在这两个IP地址的每个端口8000上设置单独的应用程序。

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

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

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

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

另一种方法是使用一个程序在一个端口上监听,该程序分析流量类型(ssh、https等),它将在内部重定向到另一个“真正的”服务正在监听的端口。

例如,对于Linux, sslh: https://github.com/yrutschle/sslh