2个进程侦听同一端口-.NET未引发异常
下图显示了尝试并成功将侦听套接字(服务器)绑定到本地计算机上端口10000的2个进程: 下面是netstat的输出(供确认): (注意:javaw.exe进程是第一个在10000上打开侦听套接字的进程) 虽然我知道在某些情况下,多个进程确实可以在同一端口上侦听,但在我的特定场景中,有一些事情困扰着我:2个进程侦听同一端口-.NET未引发异常,.net,sockets,networking,port,.net,Sockets,Networking,Port,下图显示了尝试并成功将侦听套接字(服务器)绑定到本地计算机上端口10000的2个进程: 下面是netstat的输出(供确认): (注意:javaw.exe进程是第一个在10000上打开侦听套接字的进程) 虽然我知道在某些情况下,多个进程确实可以在同一端口上侦听,但在我的特定场景中,有一些事情困扰着我: 在我的应用程序中,我特别对.NET说,我希望通过 .NET不会抛出任何类型的异常/错误/端口已在使用的通知。事实上,它认为一切都很顺利 从现在起,我的服务器应用程序从未从侦听器.AcceptT
侦听器.AcceptTcpClient()调用中唤醒。本应与服务器通信的客户端应用程序接收到有效连接,但无法与“我的”服务器通信(本应是因为它建立了与“其他”进程的连接,该进程不使用其“协议”)
关于如何获取错误或防止这种情况(通过附加参数)的任何建议?我认为您需要实际启用TCP端口共享-我现在正在使用手机,所以目前我能做的最好的事情是删除链接:
不确定它为什么不引发异常。尽管如此,文档中说
TcpListener
的构造函数并没有真正验证端口是否打开,因此,它只在端口号无效时抛出ArgumentException
。其他方法,如Start
将在另一进程已打开端口时抛出SocketException
,并将ErrorCode
设置为WSAEADDRINUSE
(10048)(请参阅和)
为了防止出现这种情况,可以调用Start
并捕获SocketException
,或者使用命名空间System.Net.NetworkInformation
来查询所使用的所有端口,并确定某个特定端口是否可用,如下面的回答所示:-注意操作系统在独占性方面的一些差异。尝试以管理员身份运行。另一个想法是,尝试进入计算机管理->服务并停止Net.Tcp端口共享服务。您在评论中发布的内容似乎回答了您的问题
它与java应用程序绑定到通配符IP端点有关(0.0.0
ip4;:
用于ip6,或IPEndpoint.ANY
)。我假设上面代码片段中的adr
变量是一个特定的IP地址,而不是一个通配符地址
看看那篇文章中的表格。它列出了第二次尝试绑定到特定端点或通配符端点的结果,使用不同的套接字选项组合
简而言之,Java代码绑定在通配符0.0.0.0
端点上,没有SO_exclusiveadruse
socket选项。矩阵显示,发生这种情况时,您可以成功绑定到特定的地址,并通过请求独占地址使用
如果尝试使用通配符绑定,该表显示调用将失败。该行为可能取决于您的操作系统(请参见此处的备注)。只是猜测要检查什么。提供了有关独占地址使用的更高级的概述,但它没有帮助,因为它似乎无法“如广告所示”(我在Win7上)工作,除非我遗漏了一些重要的内容。我认为这取决于其他进程如何设置其套接字。具体来说,我无法用任何现有的开放式套接字重现该问题。尽管如此,我同意您发现了.NET Framework的问题,假设它是可重复的。您链接到的文章是关于WCF中可用的NET.tcp://协议的,WCF是Microsoft自定义的tcp派生通信协议。它位于TCP的“顶端”…啊,我罪过-应该更仔细地阅读这个问题;是的,我相信TCP共享在这种情况下帮不了你。
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
listener = new TcpListener(adr, ipport);
listener.ExclusiveAddressUse = true;