【问题标题】:UDP ping - try to get port unreachable errorUDP ping - 尝试获取端口不可达错误
【发布时间】:2013-10-07 02:52:00
【问题描述】:

我想为我的客户端/服务器应用程序实现 UDP ping,其中客户端将 UDP 数据包发送到服务器的任何临时端口以尝试获得 ICMP 端口无法访问的回复。

我有以下代码。 ReadFromUDP() 返回错误 = nil 并且从套接字读取 0 个字节。

问题是,如何从服务器读取特定端口无法访问的 ICMP 回复?

conn, _ := net.ListenUDP("udp4", src)
defer conn.Close()

t := time.Now()
conn.SetDeadline(t.Add(100 * time.Millisecond))
conn.SetReadDeadline(t.Add(250 * time.Millisecond))

w, e := conn.WriteTo([]byte("PING"), dst)
if e != nil {
    return nil, errors.New("Failed to send UDP4 ping request")
}

r, _, e := conn.ReadFromUDP(b4)
if e != nil {
    return nil, errors.New("Failed to read UDP4 response packets")
}

【问题讨论】:

  • 你试过用 IPConn 和 ReadFromIP 代替 ReadFromUDP 吗?

标签: sockets go


【解决方案1】:

检查回复消息的前 2 个字节是否为类型 3,代码 3(端口不可达):

引用RFC792

Destination Unreachable Message

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Type      |     Code      |          Checksum             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             unused                            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |      Internet Header + 64 bits of Original Data Datagram      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   IP Fields:

   Destination Address

      The source network and address from the original datagram's data.

   ICMP Fields:

   Type

      3

   Code

      0 = net unreachable;

      1 = host unreachable;

      2 = protocol unreachable;

      3 = port unreachable;

      4 = fragmentation needed and DF set;

      5 = source route failed.

【讨论】:

  • ReadFromUDP 返回 0 字节,因此没有可读取的内容。任何 ICMP 处理都将在内部完成。 conn 并没有真正返回有意义的错误消息。
猜你喜欢
  • 2019-12-18
  • 1970-01-01
  • 1970-01-01
  • 2016-02-18
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-24
相关资源
最近更新 更多