|
|
@ -6,8 +6,6 @@ import ( |
|
|
|
"log" |
|
|
|
"net" |
|
|
|
"net/http" |
|
|
|
|
|
|
|
"golang.org/x/net/ipv4" |
|
|
|
) |
|
|
|
|
|
|
|
type UdpMessage struct { |
|
|
@ -20,7 +18,7 @@ type UdpMessage struct { |
|
|
|
var multicastAddrs = []string{ |
|
|
|
"239.255.255.250:2024", |
|
|
|
"239.255.255.251:2024", |
|
|
|
"224.0.0.251:1234", |
|
|
|
"224.0.0.251:2024", |
|
|
|
} |
|
|
|
var OnlineUsers = make(map[string]UdpMessage) |
|
|
|
|
|
|
@ -87,75 +85,24 @@ func SendMulticast(message UdpMessage) error { |
|
|
|
|
|
|
|
// ListenForMulticast 监听所有多播消息
|
|
|
|
func ListenForMulticast() { |
|
|
|
// 使用本地地址进行监听
|
|
|
|
localAddr, err := net.ResolveUDPAddr("udp4", "0.0.0.0:2024") |
|
|
|
// 使用本地地址监听
|
|
|
|
localAddr, err := net.ResolveUDPAddr("udp4", ":56780") |
|
|
|
if err != nil { |
|
|
|
log.Printf("Error resolving local UDP address: %v", err) |
|
|
|
return |
|
|
|
log.Fatalf("Failed to resolve local UDP address: %v", err) |
|
|
|
} |
|
|
|
|
|
|
|
conn, err := net.ListenUDP("udp4", localAddr) |
|
|
|
if err != nil { |
|
|
|
log.Printf("Error listening on UDP address: %v", err) |
|
|
|
return |
|
|
|
log.Fatalf("Failed to listen on UDP address: %v", err) |
|
|
|
} |
|
|
|
defer conn.Close() |
|
|
|
|
|
|
|
udpConn := ipv4.NewPacketConn(conn) |
|
|
|
|
|
|
|
// 获取本地网络接口
|
|
|
|
localIfaces, err := net.Interfaces() |
|
|
|
if err != nil { |
|
|
|
log.Fatalf("Failed to get local interfaces: %v", err) |
|
|
|
} |
|
|
|
|
|
|
|
// 选择一个可用的网络接口
|
|
|
|
var localInterface *net.Interface |
|
|
|
for _, iface := range localIfaces { |
|
|
|
addrs, err := iface.Addrs() |
|
|
|
if err != nil { |
|
|
|
log.Printf("Failed to get addresses for interface %s: %v", iface.Name, err) |
|
|
|
continue |
|
|
|
} |
|
|
|
for _, addr := range addrs { |
|
|
|
if ipNet, ok := addr.(*net.IPNet); ok && !ipNet.IP.IsLoopback() { |
|
|
|
if ipNet.IP.To4() != nil { |
|
|
|
localInterface = &iface |
|
|
|
break |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
if localInterface != nil { |
|
|
|
break |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if localInterface == nil { |
|
|
|
log.Fatal("No suitable network interface found") |
|
|
|
} |
|
|
|
|
|
|
|
// 加入所有多播组
|
|
|
|
// for _, addrStr := range multicastAddrs {
|
|
|
|
// multicastGroup, err := net.ResolveUDPAddr("udp4", addrStr)
|
|
|
|
// if err != nil {
|
|
|
|
// log.Printf("Error resolving UDP address %s: %v", addrStr, err)
|
|
|
|
// continue
|
|
|
|
// }
|
|
|
|
|
|
|
|
// if err := udpConn.JoinGroup(localInterface, multicastGroup); err != nil {
|
|
|
|
// log.Printf("Failed to join multicast group %s: %v", multicastGroup.String(), err)
|
|
|
|
// continue
|
|
|
|
// }
|
|
|
|
|
|
|
|
// log.Printf("成功加入多播组 %s", addrStr)
|
|
|
|
// }
|
|
|
|
|
|
|
|
// 开始监听多播消息
|
|
|
|
buffer := make([]byte, 1024) |
|
|
|
for { |
|
|
|
n, _, src, err := udpConn.ReadFrom(buffer) |
|
|
|
n, remoteAddr, err := conn.ReadFromUDP(buffer) |
|
|
|
if err != nil { |
|
|
|
log.Printf("Error reading from UDP: %v, addr: %v", err, src) |
|
|
|
log.Printf("Error reading from UDP: %v", err) |
|
|
|
continue |
|
|
|
} |
|
|
|
|
|
|
@ -170,13 +117,13 @@ func ListenForMulticast() { |
|
|
|
if udpMsg.Type == "file" { |
|
|
|
RecieveFile(udpMsg) |
|
|
|
} |
|
|
|
log.Printf("Received message from %s: %s", udpMsg.IP, udpMsg.Hostname) |
|
|
|
log.Printf("Received message from %s: %s", remoteAddr, udpMsg.Hostname) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// SendToIP 向指定的 IP 地址发送 UDP 消息
|
|
|
|
func SendToIP(ip string, message UdpMessage) error { |
|
|
|
addr, err := net.ResolveUDPAddr("udp4", fmt.Sprintf("%s:2024", ip)) |
|
|
|
addr, err := net.ResolveUDPAddr("udp4", ip) |
|
|
|
if err != nil { |
|
|
|
log.Printf("Failed to resolve UDP address %s: %v", ip, err) |
|
|
|
return err |
|
|
|