下图显示了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
(注意:在10000上,javaw.exe进程是第一个打开侦听套接字的进程)。
虽然我知道在某些情况下,多个进程确实可以侦听同一端口(SO_REUSEADDR
),但在我的特定场景中,有一些事情会让我感到困扰:
SO_EXCLUSIVEADDRUSE
),通过TcpListener= new listener (adr,ipport);listener.ExclusiveAddressUse = true;
listener.AcceptTcpClient()
调用中唤醒。本应与服务器通信的客户端应用程序收到一个有效的连接,但无法与“我的”服务器通信(假设是因为它建立了到“其他”进程的连接,而“其他”进程不会说它的“协议”)。如果有人想要重现我的发现:第二个过程是Eclipse (PHP)的"Helios“版本。但具体的进程在这里应该不重要:如果一个进程可以在操作系统下做奇怪的事情,那么其他进程也可以。
关于如何获得错误或完全防止这种情况(通过附加参数),有什么建议吗?
发布于 2013-01-18 11:06:30
您在评论中发布的MSDN link似乎回答了您的问题。
它与绑定到通配符IP端点(0.0.0.0
ip4;ip6的::
或IPEndpoint.ANY
)的java应用程序有关。我假设上面代码片段中的adr
变量是一个特定的IP地址,而不是通配符地址。
看一看那篇文章中的表格。它列出了使用套接字选项的不同组合第二次尝试绑定到特定端点或通配符端点的结果。
简而言之,在没有SO_EXCLUSIVEADDRUSE
套接字选项的情况下,Java代码绑定在通配符0.0.0.0
端点上。该矩阵显示,当发生这种情况时,您可以成功绑定到特定于的地址,并通过请求独占地址使用。
如果您尝试使用通配符进行绑定,则该表显示调用将失败。
发布于 2013-01-08 10:20:58
不确定为什么它没有抛出异常。但是,文档中说TcpListener
的构造函数并不真正验证端口是否打开,所以它只在端口号无效时抛出ArgumentException
。其他方法,如Start
,会在端口已经被另一个进程打开时抛出SocketException
,并将ErrorCode
设置为WSAEADDRINUSE
(10048) (参见Start method和Socket Error Codes)。
要防止出现这种情况,可以调用Start
并捕获SocketException
,或者使用名称空间System.Net.NetworkInformation
来查询所有使用的端口,并确定某个特定端口是否可用,如下所示:In C#, how to check if a TCP port is available?
发布于 2012-11-15 00:47:46
我相信你需要真正启用TCP端口共享--我现在正在打电话,所以目前我能做的最好的事情就是丢弃一个链接:Net.TCP Port Sharing
https://stackoverflow.com/questions/13359204
复制相似问题