【发布时间】:2012-11-01 18:59:08
【问题描述】:
下图显示了 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”版本。但具体的进程在这里并不重要:如果一个进程可以在操作系统下做奇怪的事情,那么其他进程也可以。
关于如何获得错误或完全防止这种情况(通过附加参数)的任何建议?
【问题讨论】:
标签: .net sockets networking port