下图显示了 2 个尝试并成功将侦听套接字(服务器)绑定到我本地计算机上的端口 10000 的进程:
这是 netstat 的输出(用于确认):
netstat -a -n | find "10000"
TCP 0.0.0.0:10000 0.0.0.0:0 LISTENING
TCP 0.0.0.0:10000 0.0.0.0:0 LISTENING
TCP [::]:10000 [::]:0 LISTENING
(注意:javaw.exe 进程是第一个在 10000 上打开侦听套接字的进程)。
虽然我知道多个进程确实可以在同一个端口( SO_REUSEADDR
)上侦听的情况,但在我的特定场景中有些事情困扰着我:
在我的应用程序中,我特别对 .NET 说我想要一个独占侦听套接字 (
SO_EXCLUSIVEADDRUSE
)listener = new TcpListener(adr, ipport); listener.ExclusiveAddressUse = true;
.NET 不会抛出端口已在使用中的任何异常/错误/通知。事实上,它实际上相信一切都很顺利。
listener.AcceptTcpClient()
从那时起,我的服务器应用程序永远不会从呼叫中唤醒。应该与服务器通信的客户端应用程序接收到一个有效的连接,但无法与“我的”服务器通信(假设是因为它建立了与不讲其“协议”的“其他”进程的连接)。
如果有人想尝试重现我的发现:第二个过程是 Eclipse (PHP) 的“Helios”版本。但是具体的进程在这里并不重要:如果一个进程可以在操作系统下做奇怪的事情,那么其他进程也可以。
关于如何获得错误或完全防止这种情况(通过附加参数)的任何建议?