同一台机器上的两个应用程序可以绑定到同一个端口和IP地址吗?更进一步,一个应用程序可以收听来自某个IP和另一个远程IP的请求吗?我知道我可以有一个应用程序从两个线程(或叉子)开始有类似的行为,但两个没有任何共同点的应用程序可以做同样的事情吗?
对于TCP,没有.一次只能有一个应用程序在同一端口上进行侦听.现在,如果你有2个网卡,你可以让一个应用程序在第一个IP上侦听,第二个在第二个IP上使用相同的端口号.
对于UDP(多播),多个应用程序可以订阅同一端口.
是(对于TCP),如果程序设计为可以,则可以在同一个套接字上侦听两个程序.当套接字由第一个程序创建时,请确保SO_REUSEADDR
在您之前在套接字上设置该选项bind()
.但是,这可能不是你想要的.这样做的是传入的TCP连接将被定向到其中一个程序,而不是两个,因此它不会复制连接,它只允许两个程序为传入的请求提供服务.例如,Web服务器将有多个进程都在端口80上进行侦听,并且O/S会向准备接受新连接的进程发送新连接.
SO_REUSEADDR
允许其他套接字bind()
到此端口,除非已有绑定到端口的活动侦听套接字.这使您可以在崩溃后尝试重新启动服务器时绕过那些"已在使用中的地址"错误消息.
原则上,没有.
它不是一成不变的; 但它是所有API编写的方式:应用程序打开一个端口,获取它的句柄,当客户端连接(或UDP情况下的数据包)到达时,操作系统通知它(通过该句柄).
如果操作系统允许两个应用程序打开同一个端口,它将如何知道要通知哪个?
但是......有很多方法可以解决它:
正如Jed所指出的那样,你可以编写一个"主"进程,它将是唯一真正侦听端口并通知其他人的进程,使用它想要分离客户端请求的任何逻辑.
在Linux和BSD(至少)上,您可以设置"重新映射"规则,根据任何网络相关标准(可能是原始网络,或某些网络),将数据包从"可见"端口重定向到不同的端口(应用正在侦听的位置)简单的负载均衡形式).
是.
多个侦听TCP套接字都可以共存,只要它们都绑定到不同的本地IP地址,它们都可以共存.客户可以连接到他们需要的任何一个.这不包括0.0.0.0
(INADDR_ANY
).
多个接受的套接字可以共存,所有套接字都可以从同一个侦听套接字接收,所有套接字都显示与侦听套接字相同的本地端口号.
所有绑定到同一端口的多个UDP套接字都可以共存,提供与(1)相同的条件,或者它们都SO_REUSEADDR
在绑定之前设置了选项.
TCP端口和UDP端口占用不同的命名空间,因此使用TCP端口并不排除它用于UDP,反之亦然.
参考:Stevens&Wright,TCP/IP Illustrated,第二卷.
是肯定的.据我记得从内核版本3.9(不确定版本)开始支持SO_REUSEPORT
.SO_RESUEPORT
允许绑定到完全相同的端口和地址,只要第一个服务器在绑定其套接字之前设置此选项.
它适用于TCP和UDP.有关更多详细信息,请参阅链接:SO_REUSEPORT
注意:根据我的观点,接受的答案不再适用.
不可以.一次只能有一个应用程序绑定到端口,并且强制绑定时的行为是不确定的.
使用多播套接字 - 听起来不像您想要的那样 - 只要在每个套接字的选项中设置了SO_REUSEADDR,多个应用程序就可以绑定到端口.
您可以通过编写一个"主"进程来完成此操作,该进程接受并处理所有连接,然后将它们交给需要在同一端口上侦听的两个应用程序.这是Web服务器等采取的方法,因为许多进程需要监听80.
除此之外,我们进入细节 - 你标记了TCP和UDP,它是什么?还有什么平台?