【发布时间】: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 意识到了这一点。