Почему Go отправляет мой многоадресный пакет только через интерфейс обратной связи? - PullRequest
0 голосов
/ 15 марта 2020

Я не могу отправить многоадресный запрос в ЛС с Go на Win10.

У меня Windows 10 1909.

У меня запущен wireshark с фильтром host 239.255.255.250 or host 172.19.21.116 or port 1982, где .116 это IP-адрес устройства, которое я ищу.

У меня есть Приложение YeeLight UWP установлено

У меня есть этот код ( удаляется каждые if err != nil ):

package main

import (
    "bytes"
    "net"
    "time"
)

func main() {
    bulbMulticastAddr := &net.UDPAddr{IP: net.IPv4(239, 255, 255, 250), Port: 1982}
    bulbSearchRequest := new(bytes.Buffer)
    _, err := bulbSearchRequest.WriteString("M-SEARCH * HTTP/1.1\r\nHOST:239.255.255.250:1982\r\nMAN:\"ssdp:discover\"\r\nST:wifi_bulb\r\n")
    conn, err := net.ListenUDP("udp4", bulbMulticastAddr)
    conn.WriteTo(bulbSearchRequest.Bytes(), bulbMulticastAddr)
    time.Sleep(time.Duration(6) * time.Second)
}

Когда я запускаю go run myapp, в WireShark я вижу одиночный пакет UDP с источником 127.0.0.1 и назначением 239.255.255.250

Когда я запускаю приложение Yeelight UWP в WireShark Я вижу в WireShark два одинаковых пакета: один с интерфейсом Ethe rnet, а другой с обратной связью.

И через некоторое время ОС работает (несколько часов - работают разные приложения), она начинает работать.

Когда я использую

iflist, _ := net.Interfaces() // iflist[0] is Ethernet
conn, err := net.ListenMulticastUDP("udp4", &iflist[0], bulbMulticastAddr)
conn.WriteTo(bulbSearchRequest.Bytes(), bulbMulticastAddr)

Все идет хорошо

Что я делаю не так? Каждый урок о многоадресной рассылке показывает, как я поступаю правильно, но он работает не так, как ожидалось. Я что-то упустил?

Почему ListenUDP () не работает должным образом?

go version go1.14 windows/amd64

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...