簡體   English   中英

如何使用golang在Internet上實現多播?

[英]How to use golang to implement multicast over Internet?

我是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)
    }
}

我在大學實驗室局域網中的多台計算機上運行了代碼,一台計算機運行了ping功能以發送多播數據包,其他計算機運行了功能serveMulticastUDP來接收多播數據包。 但是當我在一台計算機上運行功能ping並在Internet上的另一台計算機上運行功能serveMulticastUDP(兩台計算機不在局域網中)時,它無法接收數據。接收器具有NAT且沒有公共IP地址。

我看到有人回答說Internet不支持多播。但是據我所知,VOIP是多播技術的一個示例,我們可以在Internet中實現多播。

那么,接收器無法接收數據包的原因是什么?我應該怎么做才能修改代碼以實現Internet多播?

組播路由與單播路由有很大的不同。 組播是一種廣播形式,通常不會跨越路由器。 您可以啟用多播路由,但是必須在路徑中的所有路由器上啟用(使用相同的多播路由類型),而這根本不可能在公共Internet上發生。 公用Internet將從密集模式多播崩潰,並且沒有ISP會將資源專用於稀疏模式。

我不知道您為什么認為VoIP使用多播(不是)。

如果要通過公用Internet從一個站點組播到另一個站點,則必須使用支持組播的隧道,例如GRE。 這會將您的多播數據包包裝在單播數據包中,以穿越公共Internet。 您仍然必須在每端配置路由器以支持多播路由。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM