SIP コールを設定するために UDP パケットを送信する必要がある SIP アプリケーションがあります。SIP には、配信の失敗に対処するためのタイムアウト メカニズムがあります。私ができるようにしたい追加のことは、SIPが使用する32秒の再送信間隔を待たなければならないためにUDPソケットが閉じられているかどうかを検出することです。
私が言及しているケースは、UDP ソケットに送信しようとした結果、リモート ホストによって ICMP Destination Unreachable パケットが生成された場合です。起動しているがポートがリッスンしていないホストに UDP パケットを送信しようとすると、ICMP メッセージがパケット トレーサーと共に戻ってくるのを確認できますが、C# コードからそのホストにアクセスするにはどうすればよいでしょうか?
生のソケットをいじっていますが、プログラムが ICMP パケットを受信することはまだできていません。以下のサンプルでは、PC に ICMP メッセージが届いているにもかかわらず、パケットを受信しません。
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());
以下は、10.0.0.100 (私の PC) から 10.0.0.138 (私のルーター) への UDP パケットをリッスンしていないことがわかっているポートで送信しようとして、私の PC に着信する ICMP 応答を示す Wireshark トレースです。私の問題は、任意の期間後にアプリケーションがタイムアウトするのを待つのではなく、これらの ICMP パケットを利用して UDP 送信が失敗したことを認識する方法です。