两个应用程序可以听同一个端口吗?
同一台计算机上的两个应用程序可以绑定到相同的端口和IP地址吗? 更进一步,一个应用程序可以监听来自某个IP的请求,另一个可以监听另一个远程IP的请求吗? 我知道我可以有一个应用程序以两个线程(或叉子)开始具有相似的行为,但两个没有任何共同点的应用程序可以执行相同的操作吗?
对于TCP,没有。 一次只能有一个应用程序在同一端口上侦听。 现在,如果您有两块网卡,则可以让一个应用程序使用相同的端口号侦听第一个IP和第二个IP上的第二个IP。
对于UDP(多播),多个应用程序可以订阅相同的端口。
是的(对于TCP),如果程序设计为这样,则可以让两个程序在同一个套接字上侦听。 当套接字由第一个程序创建时,请确保在bind()
之前在套接字上设置了SO_REUSEADDR
选项。 但是,这可能不是你想要的。 这是一个传入的TCP连接将被引导到其中一个程序,而不是两个,所以它不会重复连接,它只是允许两个程序来处理传入的请求。 例如,Web服务器将有多个进程在端口80上侦听,并且O / S向准备好接受新连接的进程发送新连接。
SO_REUSEADDR
允许其他套接字bind()
到此端口,除非已经有一个活动的监听套接字绑定到端口。 当您尝试在崩溃后重新启动服务器时,可以避开那些“地址已被使用”错误消息。
原则上,不。
它不是写在石头上的; 但所有API都是这样编写的:应用程序打开一个端口,获取一个端口,当客户端连接(或UDP中的一个包)到达时,操作系统会通知它(通过该句柄)。
如果操作系统允许两个应用程序打开同一个端口,它将如何知道要通知哪一个?
但是......有办法解决这个问题: