2个进程侦听同一端口-.NET未引发异常

2个进程侦听同一端口-.NET未引发异常,.net,sockets,networking,port,.net,Sockets,Networking,Port,下图显示了尝试并成功将侦听套接字(服务器)绑定到本地计算机上端口10000的2个进程: 下面是netstat的输出(供确认): (注意:javaw.exe进程是第一个在10000上打开侦听套接字的进程) 虽然我知道在某些情况下,多个进程确实可以在同一端口上侦听,但在我的特定场景中,有一些事情困扰着我: 在我的应用程序中,我特别对.NET说,我希望通过 .NET不会抛出任何类型的异常/错误/端口已在使用的通知。事实上,它认为一切都很顺利 从现在起,我的服务器应用程序从未从侦听器.AcceptT

下图显示了尝试并成功将侦听套接字(服务器)绑定到本地计算机上端口10000的2个进程:

下面是netstat的输出(供确认):

(注意:javaw.exe进程是第一个在10000上打开侦听套接字的进程)

虽然我知道在某些情况下,多个进程确实可以在同一端口上侦听,但在我的特定场景中,有一些事情困扰着我:

  • 在我的应用程序中,我特别对.NET说,我希望通过

  • .NET不会抛出任何类型的异常/错误/端口已在使用的通知。事实上,它认为一切都很顺利

  • 从现在起,我的服务器应用程序从未从
    侦听器.AcceptTcpClient()调用中唤醒。本应与服务器通信的客户端应用程序接收到有效连接,但无法与“我的”服务器通信(本应是因为它建立了与“其他”进程的连接,该进程不使用其“协议”)

  • 如果有人想复制我的发现:第二个过程是Eclipse(PHP)的“Helios”版本。但是具体的进程在这里并不重要:如果一个进程可以在操作系统下做奇怪的事情,那么其他进程也可以


    关于如何获取错误或防止这种情况(通过附加参数)的任何建议?

    我认为您需要实际启用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;