【问题标题】:How to receive ICMP response "Port unreachable" to UDP message in C#如何在 C# 中接收对 UDP 消息的 ICMP 响应“端口不可达”
【发布时间】:2013-04-22 20:47:51
【问题描述】:

我正在尝试在C# 中接收对 UDP 消息的 ICMP 响应“端口无法访问”,这就是我想要做的:

IPEndPoint remoteEndpoint = new IPEndPoint(IPAddress.Parse("192.168.211.133"), 0);
var udpClient = new UdpClient("192.168.211.133", 20);
Byte[] messagebyte = Encoding.Default.GetBytes("hi".ToCharArray());
int s = udpClient.Send(messagebyte, messagebyte.Length);
Byte[] ReceiveBuffer = new Byte[256];
ReceiveBuffer = udpClient.Receive(ref remoteEndpoint); 

但是程序卡住了

ReceiveBuffer = udpClient.Receive(ref remoteEndpoint);

我做错了什么?

请帮帮我!

【问题讨论】:

    标签: c# udp icmp


    【解决方案1】:

    UDP 的全部意义在于可能没有响应。经过一定时间后,您需要假设目的地不可读。

    看看这个other question

    【讨论】:

    • 这并不完全正确,如果端口不可访问,则 icmp 数据包从目的地发送,并带有“不可访问端口”消息。我知道这个 udp 端口​​是不可访问的。我用wire Shark检查了它,有一个从目的地发送给我的icmp数据包,但由于某种原因我无法捕获它。
    • 但感谢您的链接,它解决了我的“如何等待响应”问题,我正在寻找答案:)
    • 也许this 会有所帮助?
    • 这是另一个SO question
    • 谢谢,我试过了,但还是没有抓到那个数据包。我认为这是一个同步问题。当我试图抓住它时,数据包不见了。
    【解决方案2】:

    如果您捕获到异常并且 SocketErrorCode == SocketError.ConnectionReset,则意味着您收到“端口不可达”。

    或者,你可以设置一个socket使用协议Icmp,像这样:

    Socket icmp = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp);

    【讨论】:

      【解决方案3】:

      地址似乎是我尝试过的问题,如果您将其更改为 127.0.0.1,您确实会收到 icmp 消息

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-18
        • 1970-01-01
        • 2013-02-08
        • 1970-01-01
        • 2015-11-03
        • 2012-09-17
        相关资源
        最近更新 更多