同一机器上的两个应用程序可以绑定到相同的端口和IP地址吗?更进一步,一个应用程序可以侦听来自某个IP的请求,而另一个应用程序可以侦听来自另一个远程IP的请求吗? 我知道我可以让一个应用程序启动两个线程(或分支)具有类似的行为,但是两个没有任何共同之处的应用程序也可以这样做吗?
当前回答
您可以让一个应用程序侦听一个网络接口的一个端口。因此你可以有:
HTTPD监听远程可访问的接口,例如192.168.1.1:80 另一个守护进程监听127.0.0.1:80
示例用例可以是使用httpd作为负载均衡器或代理。
其他回答
您可以让两个应用程序侦听同一个网络接口上的同一个端口。
指定的网络接口和端口只能有一个监听套接字,但该套接字可以在多个应用程序之间共享。
如果你在一个应用进程中有一个监听套接字,并且你fork了这个进程,这个套接字将被继承,所以从技术上讲,现在将有两个进程监听同一个端口。
原则上,没有。
这不是刻在石头上的;但这是所有api的编写方式:应用程序打开一个端口,获得它的句柄,当客户端连接(或UDP情况下的数据包)到达时,操作系统(通过该句柄)通知它。
如果操作系统允许两个应用程序打开同一个端口,它怎么知道该通知哪一个呢?
但是…有一些方法可以解决这个问题:
正如Jed所指出的,您可以编写一个“主”进程,这将是唯一一个真正侦听端口并通知其他端口的进程,使用任何它想要分离客户端请求的逻辑。 在Linux和BSD(至少)上,你可以设置“重映射”规则,将数据包从“可见”端口重定向到不同的端口(应用程序正在侦听的端口),根据任何与网络相关的标准(可能是原始网络,或一些简单的负载平衡形式)。
如果至少有一个远程ip是已知的,静态的,专用于只与你的一个应用程序对话,你可以使用iptables规则(表nat,链PREROUTING)来重定向从这个地址到“共享”本地端口的传入流量到任何其他端口,其中适当的应用程序实际监听。
是也不是。只有一个应用程序可以在一个端口上进行主动侦听。但是该应用程序可以将其连接遗留给另一个进程。因此,您可以让多个进程在同一个端口上工作。
分享一下@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
推荐文章
- 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失败:端口已经分配