Я новичок в программировании golang и программировании многоадресной рассылки. Я видел программу о многоадресной рассылке golang в https://gist.github.com/fiorix/9664255.
import (
"encoding/hex"
"log"
"net"
"time"
)
const (
srvAddr = "224.0.0.1:9999"
maxDatagramSize = 8192
)
//send multicast data
func ping(a string) {
addr, err := net.ResolveUDPAddr("udp", a)
if err != nil {
log.Fatal(err)
}
c, err := net.DialUDP("udp", nil, addr)
for {
c.Write([]byte("hello, world\n"))
time.Sleep(1 * time.Second)
}
}
//print received data
func msgHandler(src *net.UDPAddr, n int, b []byte) {
log.Println(n, "bytes read from", src)
log.Println(hex.Dump(b[:n]))
}
//join multicast group and receive multicast data
func serveMulticastUDP(a string, h func(*net.UDPAddr, int, []byte)) {
addr, err := net.ResolveUDPAddr("udp", a)
if err != nil {
log.Fatal(err)
}
l, err := net.ListenMulticastUDP("udp", nil, addr)
l.SetReadBuffer(maxDatagramSize)
for {
b := make([]byte, maxDatagramSize)
n, src, err := l.ReadFromUDP(b)
if err != nil {
log.Fatal("ReadFromUDP failed:", err)
}
h(src, n, b)
}
}
Я запустил код на нескольких компьютерах в локальной сети университетской лаборатории. На одном компьютере была запущена функция ping для отправки многоадресных пакетов, а на другом — функция serveMulticastUDP для получения многоадресных пакетов. Но когда я запустил функцию ping на одном компьютере и запустил функцию serveMulticastUDP на другом компьютере в Интернете (два компьютера не в локальной сети), он не смог получить данные. Ресивер имеет NAT и не имеет общедоступного IP-адреса. .
Я видел ответы некоторых людей, что Интернет не поддерживает многоадресную рассылку. Но, поскольку я знаю, что VOIP является примером технологии многоадресной рассылки, мы можем реализовать многоадресную рассылку в Интернете.
Так в чем причина того, что получатель не может принимать пакеты? Что мне нужно сделать, чтобы изменить код для реализации многоадресной рассылки через Интернет?