Browse Source

change udp

master
godo 9 months ago
parent
commit
1c99a92fa9
  1. 71
      godo/localchat/udp.go

71
godo/localchat/udp.go

@ -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

Loading…
Cancel
Save