SIP 호출을 설정하기 위해 UDP 패킷을 보내야하는 SIP 응용 프로그램이 있습니다. SIP에는 전달 실패에 대처할 수있는 시간 초과 메커니즘이 있습니다. 추가적으로 제가 할 수있는 일은 SIP가 사용하는 32s 재전송 간격을 기다리기 위해 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를 추적하다 듣지 않았다. 내 문제는 그 ICMP 패킷을 사용하여 임의의 시간이 지난 후 응용 프로그램이 대기하는 것을 기다리는 대신 UDP 전송이 실패했다는 것을 깨닫는 것입니다.
도움이되는지 여부는 알 수 없습니다. 그러나 나는 Socket.BeginReceiveFrom을 사용하고 있으며 때때로 SocketException (10054)의 SocketException과 함께 실패 할 것이다. UDP 프로토콜에서 소켓이 ICMP Port Unreachable 메시지를 수신했다는 통지. – SilverX
소켓에서 수신 한 것과 관계없이 동일한 예외가 발생합니다. 내가 항상 가지고있는 문제는 예외가 ICMP 응답이 어느 원격 호스트에서 왔는지 알려주지 않았다는 것입니다. 이것이 바로 ICMP 리스너가 할 수있는 일입니다. – sipwiz
3 년 후에도 솔루션을 제공하는 데 여전히 신경 쓸 것입니다. –