我所指的情况是当尝试发送到UDP套接字时,远程主机生成ICMP目标不可达数据包。如果我尝试向一个正在运行但端口未监听的主机发送UDP数据包,我可以看到ICMP消息返回并带有数据包跟踪器,但问题是如何从我的C#代码中访问它?
我正在玩弄原始套接字,但迄今为止尚未能够使ICMP数据包被我的程序接收。即使ICMP消息在我的PC上到达,下面的示例也永远不会接收到数据包。
Socket icmpListener = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp);
icmpListener.Bind(new IPEndPoint(IPAddress.Any, 0));
byte[] buffer = new byte[4096];
EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
int bytesRead = icmpListener.ReceiveFrom(buffer, ref remoteEndPoint);
logger.Debug("ICMPListener received " + bytesRead + " from " + remoteEndPoint.ToString());
以下是一个Wireshark跟踪,显示了来自尝试从10.0.0.100(我的电脑)发送UDP数据包到10.0.0.138(我的路由器)上我知道它没有在监听的端口的ICMP响应。我的问题是如何利用这些ICMP数据包来实现UDP发送失败,而不仅仅是等待应用程序在任意时间后超时?