【发布时间】:2012-06-09 23:12:29
【问题描述】:
我有一个充当 HTTP 服务器的第三方库。我向它传递了一个地址和端口,然后它用它来监听传入的连接。这个库以这样一种方式进行侦听,即它不接收端口的独占使用和它绑定的地址。结果,我可以多次监听同一个端口。
我需要在同一个进程中运行这个 HTTP 服务器的多个实例。每个实例都有一个默认端口,但如果该端口不可用,则应使用下一个可用端口。这就是我的问题所在;我可以让两个 HTTP 服务器监听同一个端口。
我无法更改 HTTP 服务器的代码,如果 HTTP 服务器无法侦听我给它的端口,它不会提醒我,因此我必须能够在启动每个 HTTP 服务器之前检查端口是否已在使用中。我尝试通过绑定我自己的套接字并将 SO_REUSEADDR 设置为 FALSE 和 SO_EXCLUSIVEADDRUSE 设置为 TRUE 来检查端口是否已经被监听,但是当现有的 HTTP 服务器已经在监听该端口时,绑定和监听调用都会成功。
这个HTTP服务器是如何实现这个效果的,如何才能准确的判断一个端口是否被这样监听?
【问题讨论】:
-
您是否有理由必须使用这个特定的 HTTP 服务器库?鉴于它已损坏,并且您没有足够的控制权,甚至无法弄清楚它在做什么以使其正常工作,因此切换似乎是一个非常好的主意。
-
出于好奇,它是哪个库?
-
“这个库以这样一种方式进行监听,它不会接收到它所绑定的端口和地址的独占使用”。这在 TCP 中是不可能的。 TCP 中唯一可能的端口共享形式是绑定到不同的本地 IP 地址和相同的端口号。您需要重新调查,然后重新提出您的问题。
-
@EJP:如果不可能,这是怎么回事? i.imgur.com/7ukBb.png我可以重现这个,不管我绑定到什么地址。
-
@EJP:在 Windows 上,两个 TCP 套接字完全有可能绑定同一个端口。这不是有用(文档明确表示效果未定义和不确定),但它肯定会发生。 (听起来 OP 试图做的是阻止它发生,因为它没有用......虽然我承认我仍然不太清楚他的确切意图。)