У меня есть приложение SIP, которому необходимо отправить UDP-пакеты для настройки вызовов SIP. SIP имеет механизм тайм-аута для устранения сбоев доставки. Еще одна вещь, которую я хотел бы сделать, - определить, закрыт ли сокет UDP, чтобы ждать интервал повторной передачи 32 SIP.Слушайте ICMP-пакеты в C#
Случаи, о которых я говорю, это когда попытка отправить в сокет UDP приводит к сбою ICMP Destination Unreachable, который создается удаленным хостом. Если я попытаюсь отправить UDP-пакет на хост, но он не прослушивается, я вижу сообщение ICMP, возвращающееся с помощью трассировщика пакетов, но вопрос в том, как получить доступ к этому из моего кода на C#?
Я играю с сырыми сокетами, но пока не смог получить ICMP-пакеты, которые будут получены моей программой. Пример ниже никогда не получает пакет, даже если 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());
Ниже Wireshark след, показывая ответов ICMP, поступающие в мой компьютер от попытки отправить UDP пакет от 10.0.0.100 (мой компьютер) к 10.0.0.138 (маршрутизатор) на порт я знаю, что это не слушая. Моя проблема заключается в том, как использовать эти ICMP-пакеты для реализации отказа UDP, а не просто ожидания ожидания приложения после произвольного периода?
Я не знаю, помогает ли это или нет. Но используя я использовал Socket.BeginReceiveFrom, и время от времени он будет сбой с SocketException SocketError.ConnectionReset (10054). В соответствии с протоколом UDP это уведомление о том, что сокет получил сообщение ICMP Port Unreachable. – SilverX
То же исключение выбрасывается независимо от того, как вы получаете из сокета. Проблема, с которой я всегда сталкивался, заключалась в том, что исключение не сообщило вам, какой удаленный хост получил ответ ICMP. Это то, что может сделать слушатель ICMP. – sipwiz
Late +1 для по-прежнему заботы о предоставлении решения через 3 года! –