SIPコールを設定するためにUDPパケットを送信する必要があるSIPアプリケーションがあります。 SIPには配信失敗に対処するためのタイムアウトメカニズムがあります。もう1つのことは、SIPが使用する32秒の再送信間隔を待たなければならないために、UDPソケットが閉じられているかどうかを検出することです。C#でICMPパケットを聴く
私が言及しているケースは、UDPソケットに送信しようとすると、リモートホストによってICMP Destination Unreachableパケットが生成される場合です。私が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());
私はそれを知っているポート上で(私のルータ)10.0.0.138に10.0.0.100(私のPC)からのUDPパケットを送信しようとするから私のPCに入ってくるICMP応答を示すWiresharkのトレースであります聞いていない私の問題は、UDP送信が、アプリケーションが任意の期間の後にタイムアウトするのを待つのではなく、失敗したことを認識するために、これらのICMPパケットを使用する方法です。
私はそれが役立つかどうかわかりません。しかし、私はSocket.BeginReceiveFromを使用していますが、SocketException(10054)のSocketExceptionで失敗することがあります。 UDPプロトコルの下で、ソケットがICMP Port Unreachableメッセージを受信したという通知。 – SilverX
ソケットからの受信方法に関係なく、同じ例外がスローされます。私がいつも持っていた問題は、例外がICMP応答がどのリモートホストから来たのかを教えてくれなかったことです。それはICMPリスナーができることです。 – sipwiz
3年後に解決策を提供するためにまだ気をつけている場合は、後1にしてください! –