同一机器上的两个应用程序可以绑定到相同的端口和IP地址吗?更进一步,一个应用程序可以侦听来自某个IP的请求,而另一个应用程序可以侦听来自另一个远程IP的请求吗? 我知道我可以让一个应用程序启动两个线程(或分支)具有类似的行为,但是两个没有任何共同之处的应用程序也可以这样做吗?
当前回答
您可以让两个应用程序侦听同一个网络接口上的同一个端口。
指定的网络接口和端口只能有一个监听套接字,但该套接字可以在多个应用程序之间共享。
如果你在一个应用进程中有一个监听套接字,并且你fork了这个进程,这个套接字将被继承,所以从技术上讲,现在将有两个进程监听同一个端口。
其他回答
是也不是。只有一个应用程序可以在一个端口上进行主动侦听。但是该应用程序可以将其连接遗留给另一个进程。因此,您可以让多个进程在同一个端口上工作。
Yes (for TCP) you can have two programs listen on the same socket, if the programs are designed to do so. When the socket is created by the first program, make sure the SO_REUSEADDR option is set on the socket before you bind(). However, this may not be what you want. What this does is an incoming TCP connection will be directed to one of the programs, not both, so it does not duplicate the connection, it just allows two programs to service the incoming request. For example, web servers will have multiple processes all listening on port 80, and the O/S sends a new connection to the process that is ready to accept new connections.
SO_REUSEADDR
允许其他套接字bind()绑定到该端口,除非已经有一个活动监听套接字绑定到该端口。这使您能够在崩溃后尝试重新启动服务器时绕过“地址已在使用”错误消息。
原则上,没有。
这不是刻在石头上的;但这是所有api的编写方式:应用程序打开一个端口,获得它的句柄,当客户端连接(或UDP情况下的数据包)到达时,操作系统(通过该句柄)通知它。
如果操作系统允许两个应用程序打开同一个端口,它怎么知道该通知哪一个呢?
但是…有一些方法可以解决这个问题:
正如Jed所指出的,您可以编写一个“主”进程,这将是唯一一个真正侦听端口并通知其他端口的进程,使用任何它想要分离客户端请求的逻辑。 在Linux和BSD(至少)上,你可以设置“重映射”规则,将数据包从“可见”端口重定向到不同的端口(应用程序正在侦听的端口),根据任何与网络相关的标准(可能是原始网络,或一些简单的负载平衡形式)。
肯定是的。据我所知,从内核版本3.9(不确定版本)开始,就引入了对SO_REUSEPORT的支持。SO_RESUEPORT允许绑定到完全相同的端口和地址,只要第一个服务器在绑定套接字之前设置了这个选项。
它适用于TCP和UDP。有关更多详细信息,请参阅链接:SO_REUSEPORT
答案取决于所考虑的操作系统。总的来说:
对于TCP,没有。同一时间只能有一个应用程序侦听同一端口。现在,如果您有2个网卡,您可以让一个应用程序在第一个IP上侦听,第二个应用程序在第二个IP上侦听,使用相同的端口号。
对于UDP (Multicasts),多个应用程序可以订阅同一个端口。
编辑:自Linux Kernel 3.9及更高版本以来,使用SO_REUSEPORT选项添加了对多个应用程序侦听同一端口的支持。更多信息可以在lwn.net文章中找到。
推荐文章
- 127.0.0.1和localhost之间的区别是什么
- 为什么SCTP不常用/不为人所知
- 无法启动IIS Express Web服务器,注册URL失败,访问被拒绝
- 我可以在/etc/hosts中映射主机名*和端口*吗?
- 如何修改Play执行run命令时使用的默认端口(9000)?
- 如何找到可用的端口?
- UDP和TCP比起来快多少?
- ssh -L转发多个端口
- 套接字的连接超时和读超时之间的区别是什么?
- 将主机端口转发到docker容器
- 远程主机强制关闭现有连接
- TCP连接的最大数据包大小
- HTTP 1.1和HTTP 2.0的区别是什么?
- connectexception:拒绝连接
- Docker -绑定0.0.0.0:4000失败:端口已经分配