【问题标题】:How can I handle when a UdpClient is listening on an address which is no longer available?当 UdpClient 正在侦听不再可用的地址时,我该如何处理?
【发布时间】:2013-05-14 21:44:43
【问题描述】:

我正在使用绑定到提供的端点的 UdpClient 来侦听传入的数据包。我的代码如下:

        ... 
        string myIpAddress = "192.168.1.100";
        int myPort = 50000;

        IPEndPoint selfEndPoint = new IPEndPoint(IPAddress.Parse(myIpAddress), myPort);
        IPEndPoint anySourceEndPoint = new IPEndPoint(IPAddress.Any, 0);

        UdpClient receivingClient = new UdpClient();
        receivingClient.Client.Bind(selfEndPoint); // Can throw.

        receivingClient.Receive(ref anySourceEndPoint);
        ... 

如果 IP 地址为“192.168.1.100”的接口不存在,则会抛出 SocketException`(如预期的那样)。如果存在这样的接口,UdpClient 会成功绑定并等待传入​​的数据包。我的问题如下。

如何检测到我在Receive 上被阻止并且接口地址不再可用的情况?

例如,应用程序正在运行并正在等待传入的数据包。然后用户禁用系统上的网络接口。应用程序仍然假定它可以接收数据包,即使它不能。

我的关闭是在客户端上设置ReceiveTimeout,并在发生此超时时重新创建/绑定 UdpClient;我希望有替代方案或任何其他建议。

【问题讨论】:

  • 我理解正确吗?您希望能够处理用户禁用他的网卡吗?如果我确实理解正确,那么您希望对此做什么?你写过你想重新创建/绑定一个 UdpClient,但是如果没有启用的网卡怎么办?
  • @JanDoerrenhaus 网卡不是问题。我认为问题在于,与 TCP(SYN、ACK 等)不同,在关闭连接请求上没有发送数据包?最好的办法可能是捕获 SocketException 并使用提供的 ErrorCode
  • @LewsTherin “然后用户禁用系统上的网络接口。”对我来说,这听起来确实像是网卡的问题。
  • @JanDoerrenhaus 是的,但那只是一个例子……它可能是关闭 UDP 客户端应用程序或其他什么。问题是“断开连接”..否则我根本不明白这个问题。
  • @LewsTherin UDP 中没有断开连接。我确实认为 OP 意识到了这一点。

标签: c# udpclient


【解决方案1】:

UDP 是完全无状态的。经验法则是:你不能依赖任何东西。不在发送时,不在接收时,也不在出错时出错。

UDP 静静地等待下一个数据包。通过将其绑定到端点,您只需告诉它丢弃未明确发送到此端点的任何内容。因此,如果用户禁用了他的网卡,它仍然会等待发送到绑定端点的数据包,即使数据包无法到达。一旦您再次激活卡,并且有人向该端点发送数据,UDP 客户端就会收到它,就好像什么都没发生一样。

长话短说:您的UdpClient 不是用于确定网卡是否被禁用的软件的选择。如果您真的想处理这种情况,您将不得不找出其他方法并手动禁用您的UdpClient。例如,您可以在其他端口上初始化 TCP。我相当肯定,如果您随后禁用网卡,这实际上会产生错误。

【讨论】:

    猜你喜欢
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多