【发布时间】:2017-09-19 14:50:54
【问题描述】:
我是golang编程和多播编程的新手。在https://gist.github.com/fiorix/9664255看到一个关于golang多播的程序。
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)
}
}
我在大学实验室 LAN 的几台计算机上运行代码。一台计算机运行函数 ping 发送多播数据包,其他计算机运行函数 serveMulticastUDP 接收多播数据包。它成功了。 但是当我在一台计算机上运行函数 ping 并在 Internet 中的另一台计算机上运行函数 serveMulticastUDP 时(两台计算机不在局域网中),它无法接收数据。接收器具有 NAT 并且没有公共 IP 地址.
我看到有人回答说互联网不支持多播。但是我知道VOIP是多播技术的一个例子,我们可以在互联网上实现多播。
那么接收方收不到数据包的原因是什么?我应该如何修改代码以实现Internet上的多播?
【问题讨论】:
标签: networking go network-programming multicast