2013-10-01 27 views
1

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

我有以下代码。 ReadFromUDP()返回从套接字读取的错误=零和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") 
} 
+1

你尝试使用IPConn和ReadFromIP代替ReadFromUDP? –

回答

0

检查类型3,代码3(端口不可达)前2个字节的应答消息:

引述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. 
+1

ReadFromUDP返回0字节,所以没有什么可读的。任何ICMP处理都将在内部完成。 conn并没有真正返回有意义的错误信息。 – ihsan