go - 在绑定到特定的 127.xxx 地址时侦听多播环回
问题描述
我想在同一台主机上运行 golang udp 客户端和服务器,客户端可以通过 224.0.0.1 环回多播向服务器发送一些数据。
客户端和服务器都需要绑定回环地址(127.xxx)。我通过添加别名更新了我的网络接口适配器,因此我的网络接口 (lo0) 如下所示,并且配置了 127.0.0.1 和 127.0.0.2:
lo0: flags=8149<UP,LOOPBACK,RUNNING,PROMISC,MULTICAST> mtu 16384
options=1203<RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP>
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
inet 127.0.0.2 netmask 0xff000000
nd6 options=201<PERFORMNUD,DAD>
由于某种原因,服务器不接收多播数据,除非我将服务器的 IP 更改为 0.0.0.0。将服务器的 IP 更改为 0.0.0.0 对我不起作用,因为我想在主机上生成几台服务器(在同一端口上),这些服务器将等待来自客户端的多播,并且使用 0.0.0.0 我会遇到冲突
var signalChan = make(chan int)
var terminateChan = make(chan int)
func TestLoopbackMulticast(t *testing.T) {
go ListenServer(net.IPv4(127, 0, 0, 1))
go SendFromClient()
<- terminateChan
}
func SendFromClient() {
<- signalChan
time.Sleep(time.Second)
addr := net.UDPAddr{
IP: net.IPv4(127, 0, 0, 2),
}
conn, err := net.ListenUDP("udp", &addr)
if err != nil {
panic(err)
}
defer conn.Close()
packetConn := ipv4.NewPacketConn(conn)
ifi, _ := net.InterfaceByName("lo0")
packetConn.SetMulticastInterface(ifi)
packetConn.SetMulticastLoopback(true)
log.Println("sending data to server...")
sentBytes, err := packetConn.WriteTo([]byte("test"), nil, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 1).To4(),
Port: 2024})
if err != nil {
log.Println("error sending data to server:", err)
}
log.Println("sent bytes", sentBytes)
}
func ListenServer(ip net.IP) {
iff, _ := net.InterfaceByName("lo0")
addr := net.UDPAddr{
Port: 2024,
IP: ip,
}
conn, err := net.ListenUDP("udp", &addr)
packetConn := ipv4.NewPacketConn(conn)
err = packetConn.JoinGroup(iff, &net.IPAddr{IP: net.IPv4(224, 0, 0, 1)})
if err != nil {
fmt.Println("error joining multicast group:", err)
}
signalChan <- 1
log.Println("waiting for client data...")
buffer := make([]byte, 2000)
bytesRead, _, remoteAddr, err := packetConn.ReadFrom(buffer)
log.Println("Received data from:", remoteAddr)
if err != nil {
log.Println(err)
return
}
log.Println(string(buffer[:bytesRead]))
terminateChan <- 1
}
解决方案
推荐阅读
- macos - Fabric 链码实例化失败
- android - 如何在 Android OpenCv 中加载 cascadeClassifier
- internationalization - Web SQL 查询返回的行数与 SQL 企业管理器查询不同
- excel - 如何在Excel中将文本转换为日期和时间
- python - 使用 Splinter 在表单中输入字符串
- sql - 我怎么知道flutter sqflite中是否存在行?
- broadcast - Modbus Master 发送数据无响应
- tsql - 在链接服务器中禁用触发器
- android - 无法在后台线程上调用观察
- tomcat - 如何防止 IntelliJ 更改 CATALINA_BASE