2013-10-01 2 views
1

Я хочу реализовать UDP-пинг для моего клиент-серверного приложения, в котором клиент отправляет UDP-пакеты на любой из эфемерных портов сервера, пытаясь получить недостижимый ответ ICMP-порта.UDP ping - попробуйте получить ошибку недоступности порта

У меня есть следующий код. ReadFromUDP() return error = 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") 
} 
+1

ли вы пытаетесь использовать IPConn и ReadFromIP вместо ReadFromUDP? –

ответ

0

Проверьте первые 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. 
+1

ReadFromUDP возвращает 0 байт, поэтому читать нечего. Любая обработка ICMP была бы сделана внутренне. conn действительно не возвращал значимого сообщения об ошибке. – ihsan

Смежные вопросы