我正在使用绑定到提供的端点的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;我希望有替代或任何其他建议。
答案 0 :(得分:0)
UDP完全无状态。经验法则是:你不能依赖任何东西。不是发送,不是接收,不是在出现问题时出错。
UDP静静地坐着等待下一个数据包。通过将其绑定到端点,您只需告诉它丢弃未明确发送到此端点的任何内容。因此,如果用户禁用他的网卡,它仍然会等待发送到绑定端点的数据包,即使数据包无法到达也是如此。只要再次激活卡,并且有人发送到该端点,UDP客户端就会收到它,就好像什么也没发生一样。
长话短说:您的UdpClient
不是软件的选择,无法确定网卡是否被禁用。如果你真的想要处理这种情况,你必须找到其他方法并手动禁用UdpClient
。例如,您可以在其他端口上初始化TCP。我相当肯定,如果你再禁用网卡,这实际上会产生错误。