2016-11-30 2 views
1

Я работаю над программой Go, которая отправляет широковещательную рассылку UDP для запроса существования устройств в локальной сети, а затем читает ответы. Используя Wireshark, я подтверждаю, что пакет передается и что одно устройство на моей (моей) сети отвечает (фактически десять раз), но мое приложение блокирует чтение, как будто он не видит входящий пакет. Вот код:Не могу прочитать ответ UDP (golang)

func Discover(timeout int) ([]string, error) { 
    inBuf := make([]byte, 1024) 
    devices := make([]string, 0) 
    var readLen int 
    var fromAddr *net.UDPAddr 

    // get server connection 
    server := fmt.Sprintf("%s:%d", bcastIP, udpDiscoverPort) // "255.255.255.255", 10000 
    serverAddr, err = net.ResolveUDPAddr("udp", server) 
    checkErr(err) 
    ourAddr, err = net.ResolveUDPAddr("udp", "192.168.1.132:10000") 
    checkErr(err) 
    conn, err = net.DialUDP("udp", ourAddr, serverAddr) 
    checkErr(err) 
    defer conn.Close() 

    // send the Discover message 
    discoverMsg := []byte(magic) 
    discoverMsg = append(discoverMsg, discovery...) 
    sendLen, err := conn.Write(discoverMsg) 
    checkErr(err) 
    fmt.Println("Sent", sendLen, "bytes") 

    // read one reply 
    readLen, fromAddr, err = conn.ReadFromUDP(inBuf) 
    fmt.Println("Read ", readLen, "bytesfrom ", fromAddr) 
    txtutil.Dump(string(inBuf[:readLen])) 
    return devices, nil 
} 

checkErr (ERR) печатает диагностическое и выходит, если допустить ошибку не ноль, BTW.

информация в ответах выглядит следующим образом:

Internet Protocol Version 4, Src: 192.168.1.126 (192.168.1.126), Dst: 192.168.1.132 (192.168.1.132) 
User Datagram Protocol, Src Port: ndmp (10000), Dst Port: ndmp (10000) 

Я попытался "0.0.0.0:10000", ": 10000" и "127.0.0.1:10000" вместо «192.168.1.132: 10000 ", и ни один из них не имеет никакого значения.

Любые предложения относительно того, что я делаю неправильно, приветствуются!

ответ

1

Вам необходимо использовать ListenUDP вместо DialUDP. Когда вы используете DialUDP, он создает «подключенный» UDP-порт, и при чтении возвращаются только пакеты, исходящие из удаленного адреса.

conn, err = net.ListenUDP("udp", ourAddr) 

Поскольку соединение не имеет назначения по умолчанию, вы также должны использовать WriteTo* методы для отправки пакетов:

sendLen, err := conn.WriteToUDP(discoverMsg, serverAddr) 
+0

Эти изменения работают. Я отметил это соответственно. Редактировать: Мне любопытно, что вы редактировали в моем оригинальном посте. Я не вижу никаких изменений. – HankB

+0

@HankB: посмотрите на diff (https://stackoverflow.com/posts/40897417/revisions), я отформатировал код так, чтобы он отображался правильно. – JimB

+0

Я был настолько сосредоточен в проблеме, что даже не заметил дрянного форматирования. ;) – HankB

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