2013-05-14 44 views
0

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

+0

我理解正确吗?你想能够处理禁用他的网卡的用户?如果我理解正确,那么你对此有何期望?你写道你想重新创建/绑定一个UdpClient,但是如果没有启用网卡,那该怎么办? –

+0

@JanDoerrenhaus网卡不是问题。我认为问题是,不像TCP(SYN,ACK等)那样,在关闭连接请求上不发送数据包?最好的事情可能是捕获SocketException并使用ErrorCode提供的 –

+0

@LewsTherin“然后用户禁用系统上的网络接口。”这听起来很像我的网卡是问题所在。 –

回答

0

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

UDP安安静静地坐在和等待下一个数据包。通过将其绑定到端点,您只需告诉它放弃任何未明确发送到此端点的内容。因此,如果用户禁用了他的网卡,它仍然会等待发送到绑定端点的数据包,即使数据包不可能到达。一旦你再次激活卡,并且有人发送到该端点,UDP客户端就会收到它,就像没有任何事情发生一样。

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

相关问题