当UdpClient正在侦听不再可用的地址时,我该如何处理?

时间:2013-05-14 21:44:44

标签: c# udpclient

我正在使用绑定到提供的端点的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;我希望有替代或任何其他建议。

1 个答案:

答案 0 :(得分:0)

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

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

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