如何使用golang实现Internet组播?
How to use golang to implement multicast over Internet?
我是golang编程和多播的新人programming.I在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.One计算机运行函数ping发送多播数据包和其他运行函数serveMulticastUDP接收多播packets.It 分离。
但是当我在一台电脑上运行 ping 和运行 在另一台电脑上使用serveMulticastUDP 时(两台电脑不在一个局域网),它无法收到data.The 接收器有NAT 并且没有 public IP 地址。
看到有人回答说Internet不支持multicast.But因为我知道VOIP是多播技术的一个例子,我们可以在Internet上实现多播
那么接收方收不到包是什么原因呢?要修改代码才能实现Internet组播?
多播路由与单播路由非常不同。多播是一种广播形式,它通常不跨越路由器。您可以启用多播路由,但必须在路径中的所有路由器上启用它(使用相同的多播路由类型),而这在 public Internet 上是不可能发生的。 public 互联网会因密集模式多播而崩溃,没有 ISP 会为稀疏模式投入资源。
我不确定您为什么认为 VoIP 使用多播(实际上没有)。
如果要通过 public Internet 从一个站点向另一个站点进行多播,则必须使用支持多播的隧道,例如GRE。这会将您的多播数据包包装在单播数据包中以通过 public Internet。您仍然必须配置每一侧的路由器以支持多播路由。
我是golang编程和多播的新人programming.I在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.One计算机运行函数ping发送多播数据包和其他运行函数serveMulticastUDP接收多播packets.It 分离。 但是当我在一台电脑上运行 ping 和运行 在另一台电脑上使用serveMulticastUDP 时(两台电脑不在一个局域网),它无法收到data.The 接收器有NAT 并且没有 public IP 地址。
看到有人回答说Internet不支持multicast.But因为我知道VOIP是多播技术的一个例子,我们可以在Internet上实现多播
那么接收方收不到包是什么原因呢?要修改代码才能实现Internet组播?
多播路由与单播路由非常不同。多播是一种广播形式,它通常不跨越路由器。您可以启用多播路由,但必须在路径中的所有路由器上启用它(使用相同的多播路由类型),而这在 public Internet 上是不可能发生的。 public 互联网会因密集模式多播而崩溃,没有 ISP 会为稀疏模式投入资源。
我不确定您为什么认为 VoIP 使用多播(实际上没有)。
如果要通过 public Internet 从一个站点向另一个站点进行多播,则必须使用支持多播的隧道,例如GRE。这会将您的多播数据包包装在单播数据包中以通过 public Internet。您仍然必须配置每一侧的路由器以支持多播路由。