From 99e4d03898a60b012dae884b56aaeb7b4cb012a4 Mon Sep 17 00:00:00 2001 From: godo Date: Thu, 5 Sep 2024 16:53:17 +0800 Subject: [PATCH] change udp --- godo/localchat/linux.go | 108 ++++++++++++++++++++++++++++ godo/localchat/udp.go | 146 +------------------------------------- godo/localchat/windows.go | 106 +++++++++++++++++++++++++++ 3 files changed, 216 insertions(+), 144 deletions(-) create mode 100644 godo/localchat/linux.go create mode 100644 godo/localchat/windows.go diff --git a/godo/localchat/linux.go b/godo/localchat/linux.go new file mode 100644 index 0000000..b0257f7 --- /dev/null +++ b/godo/localchat/linux.go @@ -0,0 +1,108 @@ +//go:build !windows +// +build !windows + +package localchat + +import ( + "encoding/json" + "log" + "net" +) + +func SendBroadcast(message UdpMessage) error { + broadcastAddr := GetBroadcastAddr() + addr, err := net.ResolveUDPAddr("udp4", broadcastAddr) + if err != nil { + log.Printf("Failed to resolve UDP address %s: %v", broadcastAddr, err) + return err + } + + // 使用本地地址进行连接 + localAddr, err := net.ResolveUDPAddr("udp4", "0.0.0.0:0") + if err != nil { + log.Printf("Failed to resolve local UDP address: %v", err) + return err + } + + conn, err := net.ListenUDP("udp4", localAddr) + if err != nil { + log.Printf("Failed to listen on UDP address %s: %v", broadcastAddr, err) + return err + } + defer conn.Close() + + // 获取本地 IP 地址 + localIP, err := GetLocalIP() + log.Printf("本地 IP 地址: %s", localIP) + if err != nil { + log.Printf("Failed to get local IP address: %v", err) + return err + } + message.IP = localIP + + data, err := json.Marshal(message) + if err != nil { + log.Printf("Failed to marshal JSON for %s: %v", broadcastAddr, err) + return err + } + + _, err = conn.WriteToUDP(data, addr) + if err != nil { + log.Printf("Failed to write to UDP address %s: %v", broadcastAddr, err) + return err + } + + log.Printf("发送消息到 %s 成功", broadcastAddr) + return nil +} + +// ListenForBroadcast 监听多播消息 +func ListenForBroadcast() { + broadcastAddr := GetBroadcastAddr() + addr, err := net.ResolveUDPAddr("udp4", broadcastAddr) + if err != nil { + log.Fatalf("Failed to resolve UDP address: %v", err) + } + // 使用 ListenMulticastUDP 创建多播连接 + conn, err := net.ListenMulticastUDP("udp4", nil, addr) + if err != nil { + log.Fatalf("Failed to listen on UDP address: %v", err) + } + defer conn.Close() + + // 获取本地 IP 地址 + localIP, err := GetLocalIP() + if err != nil { + log.Printf("Failed to get local IP address: %v", err) + } + + // 开始监听多播消息 + buffer := make([]byte, 1024) + for { + n, remoteAddr, err := conn.ReadFromUDP(buffer) + if err != nil { + log.Printf("Error reading from UDP: %v", err) + continue + } + + var udpMsg UdpMessage + err = json.Unmarshal(buffer[:n], &udpMsg) + if err != nil { + log.Printf("Error unmarshalling JSON: %v", err) + continue + } + if udpMsg.IP == localIP { + continue + } + OnlineUsers[udpMsg.IP] = udpMsg + if udpMsg.Type == "file" { + RecieveFile(udpMsg) + } + log.Printf("Received message from %s: %s", remoteAddr, udpMsg.Hostname) + } +} + +func GetBroadcastAddr() string { + //return libs.GetUdpAddr() + return "224.0.0.251:20249" +} diff --git a/godo/localchat/udp.go b/godo/localchat/udp.go index 094f519..d1797de 100644 --- a/godo/localchat/udp.go +++ b/godo/localchat/udp.go @@ -24,9 +24,7 @@ var OnlineUsers = make(map[string]UdpMessage) func init() { go InitBroadcast() go ListenForBroadcast() - go ListenLocalBroadcast() } - func InitBroadcast() { ticker := time.NewTicker(5 * time.Second) // 每 5 秒发送一次广播消息 defer ticker.Stop() @@ -43,148 +41,11 @@ func InitBroadcast() { Message: "", } //发送多播消息 - broadcastAddr := GetBroadcastAddr() - err = SendBroadcast(broadcastAddr, message) - if err != nil { - log.Println("Failed to send broadcast message:", err) - } - //发送广播播消息 - moreAddr := "255.255.255.255:20249" - err = SendBroadcast(moreAddr, message) - if err != nil { - log.Println("Failed to send more broadcast message:", err) - } - } -} - -func SendBroadcast(broadcastAddr string, message UdpMessage) error { - addr, err := net.ResolveUDPAddr("udp4", broadcastAddr) - if err != nil { - log.Printf("Failed to resolve UDP address %s: %v", broadcastAddr, err) - return err - } - - // 使用本地地址进行连接 - localAddr, err := net.ResolveUDPAddr("udp4", "0.0.0.0:0") - if err != nil { - log.Printf("Failed to resolve local UDP address: %v", err) - return err - } - - conn, err := net.ListenUDP("udp4", localAddr) - if err != nil { - log.Printf("Failed to listen on UDP address %s: %v", broadcastAddr, err) - return err - } - defer conn.Close() - - // 获取本地 IP 地址 - localIP, err := GetLocalIP() - log.Printf("本地 IP 地址: %s", localIP) - if err != nil { - log.Printf("Failed to get local IP address: %v", err) - return err - } - message.IP = localIP - - data, err := json.Marshal(message) - if err != nil { - log.Printf("Failed to marshal JSON for %s: %v", broadcastAddr, err) - return err - } - - _, err = conn.WriteToUDP(data, addr) - if err != nil { - log.Printf("Failed to write to UDP address %s: %v", broadcastAddr, err) - return err - } - - log.Printf("发送消息到 %s 成功", broadcastAddr) - return nil -} - -// ListenForBroadcast 监听多播消息 -func ListenForBroadcast() { - broadcastAddr := GetBroadcastAddr() - addr, err := net.ResolveUDPAddr("udp4", broadcastAddr) - if err != nil { - log.Fatalf("Failed to resolve UDP address: %v", err) - } - // 使用 ListenMulticastUDP 创建多播连接 - conn, err := net.ListenMulticastUDP("udp4", nil, addr) - if err != nil { - log.Fatalf("Failed to listen on UDP address: %v", err) - } - defer conn.Close() - - // 获取本地 IP 地址 - localIP, err := GetLocalIP() - if err != nil { - log.Printf("Failed to get local IP address: %v", err) - } - - // 开始监听广播消息 - buffer := make([]byte, 1024) - for { - n, remoteAddr, err := conn.ReadFromUDP(buffer) - if err != nil { - log.Printf("Error reading from UDP: %v", err) - continue - } - - var udpMsg UdpMessage - err = json.Unmarshal(buffer[:n], &udpMsg) - if err != nil { - log.Printf("Error unmarshalling JSON: %v", err) - continue - } - if udpMsg.IP == localIP { - continue - } - OnlineUsers[udpMsg.IP] = udpMsg - if udpMsg.Type == "file" { - RecieveFile(udpMsg) - } - log.Printf("Received message from %s: %s", remoteAddr, udpMsg.Hostname) - } -} - -// ListenLocalBroadcast 监听广播消息 -func ListenLocalBroadcast() { - // 使用本地地址监听 - localAddr, err := net.ResolveUDPAddr("udp4", ":56780") - if err != nil { - log.Fatalf("Failed to resolve local UDP address: %v", err) - } - - conn, err := net.ListenUDP("udp4", localAddr) - if err != nil { - log.Fatalf("Failed to listen on UDP address: %v", err) - } - defer conn.Close() - - // 开始监听广播消息 - buffer := make([]byte, 1024) - for { - n, remoteAddr, err := conn.ReadFromUDP(buffer) - if err != nil { - log.Printf("Error reading from UDP: %v", err) - continue - } - - var udpMsg UdpMessage - err = json.Unmarshal(buffer[:n], &udpMsg) + err = SendBroadcast(message) if err != nil { - log.Printf("Error unmarshalling JSON: %v", err) - continue - } - - OnlineUsers[udpMsg.IP] = udpMsg - if udpMsg.Type == "file" { - RecieveFile(udpMsg) + log.Println("Failed to send broadcast message:", err) } - log.Printf("Received message from %s: %s", remoteAddr, udpMsg.Hostname) } } @@ -243,9 +104,6 @@ func GetOnlineUsers() map[string]UdpMessage { func GetLocalIP() (string, error) { return libs.GetIPAddress() } -func GetBroadcastAddr() string { - return libs.GetUdpAddr() -} func GetBroadcastPort() string { addr := GetBroadcastAddr() return addr[strings.LastIndex(addr, ":")+1:] diff --git a/godo/localchat/windows.go b/godo/localchat/windows.go new file mode 100644 index 0000000..ad6c9ee --- /dev/null +++ b/godo/localchat/windows.go @@ -0,0 +1,106 @@ +//go:build windows +// +build windows + +package localchat + +import ( + "encoding/json" + "log" + "net" +) + +func SendBroadcast(message UdpMessage) error { + broadcastAddr := GetBroadcastAddr() + addr, err := net.ResolveUDPAddr("udp4", broadcastAddr) + if err != nil { + log.Printf("Failed to resolve UDP address %s: %v", broadcastAddr, err) + return err + } + + // 使用本地地址进行连接 + localAddr, err := net.ResolveUDPAddr("udp4", "0.0.0.0:0") + if err != nil { + log.Printf("Failed to resolve local UDP address: %v", err) + return err + } + + conn, err := net.ListenUDP("udp4", localAddr) + if err != nil { + log.Printf("Failed to listen on UDP address %s: %v", broadcastAddr, err) + return err + } + defer conn.Close() + + // 获取本地 IP 地址 + localIP, err := GetLocalIP() + log.Printf("本地 IP 地址: %s", localIP) + if err != nil { + log.Printf("Failed to get local IP address: %v", err) + return err + } + message.IP = localIP + + data, err := json.Marshal(message) + if err != nil { + log.Printf("Failed to marshal JSON for %s: %v", broadcastAddr, err) + return err + } + + _, err = conn.WriteToUDP(data, addr) + if err != nil { + log.Printf("Failed to write to UDP address %s: %v", broadcastAddr, err) + return err + } + + log.Printf("发送消息到 %s 成功", broadcastAddr) + return nil +} + +// ListenForBroadcast 监听广播消息 +func ListenForBroadcast() { + // 使用本地地址监听 + localAddr, err := net.ResolveUDPAddr("udp4", ":20249") + if err != nil { + log.Fatalf("Failed to resolve local UDP address: %v", err) + } + + conn, err := net.ListenUDP("udp4", localAddr) + if err != nil { + log.Fatalf("Failed to listen on UDP address: %v", err) + } + defer conn.Close() + // 获取本地 IP 地址 + localIP, err := GetLocalIP() + if err != nil { + log.Printf("Failed to get local IP address: %v", err) + } + // 开始监听广播消息 + buffer := make([]byte, 1024) + for { + n, remoteAddr, err := conn.ReadFromUDP(buffer) + if err != nil { + log.Printf("Error reading from UDP: %v", err) + continue + } + + var udpMsg UdpMessage + err = json.Unmarshal(buffer[:n], &udpMsg) + if err != nil { + log.Printf("Error unmarshalling JSON: %v", err) + continue + } + if udpMsg.IP == localIP { + continue + } + OnlineUsers[udpMsg.IP] = udpMsg + if udpMsg.Type == "file" { + RecieveFile(udpMsg) + } + log.Printf("Received message from %s: %s", remoteAddr, udpMsg.Hostname) + } +} + +func GetBroadcastAddr() string { + //return libs.GetUdpAddr() + return "255.255.255.255:20249" +}