多个应用程序如何在同一端口(80)上侦听?

时间:2014-06-16 15:19:27

标签: c# .net sockets tcp udp

许多与使用端口80相关的问题都有答案说有许多程序将它用作默认端口。 This post提到了一些:Skype,IIS,Apache ......

由于一次只能有一个应用程序可以侦听任何一个端口 - 这怎么可能?如果答案是那只是他们的默认端口 - 应用程序如何知道它必须将信息发送到其他端口?例如 - 如果iis将在端口81上收听,因为Skype正在收听80 - 请求网页的任何人都知道如何将请求发送到 theip:81 而不是 theip:80 < /强>

我的目标是在任何硬编码端口因某些应用程序已经监听而导致失败时,有一种强大的方法来建立程序之间的连接。端口只需要使用一次,以便传达将在会话的其余部分使用的动态端口。这对于网络连接和在同一台计算机上连接多个应用程序都是一个问题。

注册IANA并非总是可行,甚至不一定能解决问题 - 有人可能仍在监听已注册的端口。显然,&#34;的解决方案希望不会发生碰撞&#34; - 只是没有削减它。

(我知道连接有两个套接字(和一个协议),因此一个套接字可以有多个连接。我的问题是关于监听套接字以便建立连接。)

我期望的是,在操作系统(Windows)上存在一些我可以注册我的应用程序的服务,并接收带有一些签名的所有传入流量 - 即使它只是一些魔术字符串。或者可能是多个应用程序可以同时监听的端口 - 并且所有端口都会收到每个传入的消息。但到目前为止我还没有找到类似的东西。

4 个答案:

答案 0 :(得分:1)

我不相信多个套接字可以在同一个(TCP)端口上侦听。如果您尝试将套接字绑定到已打开的端口,则会出现错误。

我相信Skype通过使用自己的服务器作为会合点来解决您描述的问题。简单的解释是:

  • Alice启动了她的客户端,连接到中央服务器,并通知她正在侦听的端口。
  • Bob启动他的客户端并同样通知中央服务器。
  • 现在,Alice想要连接到Bob,但不知道将数据包发送到哪个端口。
  • Alice将向中央服务器查询Bob的端口号。
  • 使用此信息,然后使用该端口与Bob建立直接连接。

逻辑当然可以扩展到学习对方的IP地址以及甚至获取公钥。

请注意,大多数现代点对点应用程序实际上都涉及到更多,Skype也不例外。问题是大多数计算机现在至少在一个NAT路由器后面。让两个设备分别在自己的路由器后面相互连接称为NAT traversal - 最常见的技术是让中央协调服务器指示两个客户端同时相互连接。有关这方面的更多信息,我推荐Steve Gibson的Security Now!episode #42

答案 1 :(得分:1)

  

怎么会这样?简单......不是。每个端口只能监听一个应用程序。 - Adriano Repetti

右。当Skype在启动我的Web服务器之前侦听这些端口时,服务器会失败。我花了一段时间才找出原因。

只有一个应用程序可以以理智的方式监听套接字。如果您指定特殊选项但操作系统允许多个应用程序在同一端口上侦听,那就太疯狂了。然后以未指定的(即随机的)方式将接受的连接分派到不同的应用程序。

IIS可以在同一端口上运行多个Web应用程序,因为它在内核模式下打开一次端口并将连接分派给其工作进程。

答案 2 :(得分:0)

在端口转发设置页面上,我只是用逗号添加了另一个要打开的端口。它不会允许您使用侦听端口80设置其他规则,但会允许您使用该侦听端口触发多个端口

答案 3 :(得分:-1)

  • 对于TCP,您只能在一个端口上侦听一个应用程序 在一次。现在,如果您有2个网卡或创建虚拟 接口,你可以让一个应用程序监听第一个IP和 第二个IP上的第二个使用相同的端口号。
  • 对于UDP(多播),多个应用程序可以订阅相同的 端口。

one application listening on a single port这就是端口存在的原因。允许多个应用程序共享网络而不会发生冲突。

但是有办法做你要求的事情:

  • 您可以编写一个master进程,该进程拥有该端口并使用某些分离逻辑通知slave进程。
  • 在Linux和BSD上,您可以设置重新映射规则,将数据包从visible端口重定向到不同的端口(例如侦听器应用),再次使用一些分离逻辑(例如重定向)根据网络起源等。)。

注意:对于TCP,多个应用程序可以在绑定之前使用SO_REUSEADDR选项侦听同一个套接字,但这样做是将传入连接重定向到只有一个侦听器。