0

我正在使用绑定到提供的端点的 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在客户端上设置 a 并在发生此超时时重新创建/绑定 UdpClient ;我希望有替代方案或任何其他建议。

4

1 回答 1

0

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

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

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

于 2013-05-15T09:56:55.607 回答