我有一个需要发送 UDP 数据包来设置 SIP 呼叫的 SIP 应用程序。SIP 有一个超时机制来处理交付失败。我想做的另一件事是检测 UDP 套接字是否已关闭,以便必须等待 SIP 使用的 32 秒重传间隔。
我所指的情况是尝试发送到 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 跟踪,显示了 ICMP 响应进入我的 PC 的尝试,该响应是从我知道它没有在侦听的端口上尝试从 10.0.0.100(我的 PC)到 10.0.0.138(我的路由器)发送一个 UDP 数据包。我的问题是如何利用这些 ICMP 数据包来实现 UDP 发送失败,而不是仅仅等待应用程序在任意时间后超时?