Browse Source

change udp

master
godo 10 months ago
parent
commit
facf242b71
  1. 49
      godo/localchat/udp.go

49
godo/localchat/udp.go

@ -15,20 +15,16 @@ type UdpMessage struct {
Message interface{} `json:"message"` Message interface{} `json:"message"`
} }
var multicastAddrs = []string{ var broadcastAddr = "255.255.255.255:2024"
"239.255.255.250:2024",
"239.255.255.251:2024",
"224.0.0.251:2024",
}
var OnlineUsers = make(map[string]UdpMessage) var OnlineUsers = make(map[string]UdpMessage)
// SendMulticast 发送多播消息 // SendBroadcast 发送广播消息
func init() { func init() {
go InitMulticast() go InitBroadcast()
go ListenForMulticast() go ListenForBroadcast()
} }
func InitMulticast() { func InitBroadcast() {
myIP, myHostname, err := GetMyIPAndHostname() myIP, myHostname, err := GetMyIPAndHostname()
if err != nil { if err != nil {
log.Println("Failed to get IP and hostname:", err) log.Println("Failed to get IP and hostname:", err)
@ -40,51 +36,48 @@ func InitMulticast() {
Hostname: myHostname, Hostname: myHostname,
Message: "online", Message: "online",
} }
SendMulticast(message) SendBroadcast(message)
} }
func SendMulticast(message UdpMessage) error { func SendBroadcast(message UdpMessage) error {
for _, addrStr := range multicastAddrs { addr, err := net.ResolveUDPAddr("udp4", broadcastAddr)
addr, err := net.ResolveUDPAddr("udp4", addrStr)
if err != nil { if err != nil {
log.Printf("Failed to resolve UDP address %s: %v", addrStr, err) log.Printf("Failed to resolve UDP address %s: %v", broadcastAddr, err)
continue return err
} }
// 使用本地地址进行连接 // 使用本地地址进行连接
localAddr, err := net.ResolveUDPAddr("udp4", "0.0.0.0:0") localAddr, err := net.ResolveUDPAddr("udp4", "0.0.0.0:0")
if err != nil { if err != nil {
log.Printf("Failed to resolve local UDP address: %v", err) log.Printf("Failed to resolve local UDP address: %v", err)
continue return err
} }
conn, err := net.ListenUDP("udp4", localAddr) conn, err := net.ListenUDP("udp4", localAddr)
if err != nil { if err != nil {
log.Printf("Failed to listen on UDP address %s: %v", addrStr, err) log.Printf("Failed to listen on UDP address %s: %v", broadcastAddr, err)
continue return err
} }
defer conn.Close() defer conn.Close()
data, err := json.Marshal(message) data, err := json.Marshal(message)
if err != nil { if err != nil {
log.Printf("Failed to marshal JSON for %s: %v", addrStr, err) log.Printf("Failed to marshal JSON for %s: %v", broadcastAddr, err)
continue return err
} }
_, err = conn.WriteToUDP(data, addr) _, err = conn.WriteToUDP(data, addr)
if err != nil { if err != nil {
log.Printf("Failed to write to UDP address %s: %v", addrStr, err) log.Printf("Failed to write to UDP address %s: %v", broadcastAddr, err)
continue return err
}
log.Printf("发送多播消息到 %s 成功", addrStr)
} }
log.Printf("发送广播消息到 %s 成功", broadcastAddr)
return nil return nil
} }
// ListenForMulticast 监听所有多播消息 // ListenForBroadcast 监听广播消息
func ListenForMulticast() { func ListenForBroadcast() {
// 使用本地地址监听 // 使用本地地址监听
localAddr, err := net.ResolveUDPAddr("udp4", ":56780") localAddr, err := net.ResolveUDPAddr("udp4", ":56780")
if err != nil { if err != nil {
@ -97,7 +90,7 @@ func ListenForMulticast() {
} }
defer conn.Close() defer conn.Close()
// 开始监听播消息 // 开始监听广播消息
buffer := make([]byte, 1024) buffer := make([]byte, 1024)
for { for {
n, remoteAddr, err := conn.ReadFromUDP(buffer) n, remoteAddr, err := conn.ReadFromUDP(buffer)

Loading…
Cancel
Save