package main
import (
"encoding/hex"
"fmt"
"golang.org/x/net/ipv4"
"log"
"net"
)
func Listen(address string, handler func(*net.UDPAddr, int, []byte)) {
laddr := net.UDPAddr{
IP: net.IPv4(10, 10, 100, 244),
Port: 3002,
}
raddr := net.UDPAddr{IP: net.IPv4(239, 22, 22, 183), Port: 3003}
lconn, err := net.DialUDP("udp4", &laddr, &raddr)
if err != nil {
log.Fatal(err)
}
addr, err := net.ResolveUDPAddr("udp4", address)
if err != nil {
log.Fatal(err)
}
conn, err := net.ListenMulticastUDP("udp4", nil, addr)
if err != nil {
log.Fatal(err)
}
pc := ipv4.NewPacketConn(conn)
iface, err := net.InterfaceByName("eno2")
if err != nil {
log.Fatal(err)
}
if err := pc.JoinGroup(iface, &net.UDPAddr{IP: net.IPv4(239, 0, 2, 183)}); err != nil {
log.Fatal(err)
}
if loop, err := pc.MulticastLoopback(); err != nil {
fmt.Printf("mulicastLoogback status : %v\n", loop)
if !loop {
if err := pc.SetMulticastLoopback(true); err != nil {
fmt.Printf("setmuticastlooknacl error:%v\n", err)
}
}
}
conn.SetReadBuffer(2048)
for {
buffer := make([]byte, 2048)
numBytes, src, err := conn.ReadFromUDP(buffer)
lconn.Write(buffer[:numBytes])
if err != nil {
log.Fatal("ReadFromUDP failed:", err)
}
handler(src, numBytes, buffer)
}
}
func msgHandler(src *net.UDPAddr, n int, b []byte) {
fmt.Printf("%v\n", hex.Dump(b[:n]))
}
func main() {
Listen("239.0.2.183:5000", msgHandler)
}
golang接收转发组播
最新推荐文章于 2024-07-12 14:34:21 发布