Browse Source

change udp

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

81
godo/localchat/udp.go

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

Loading…
Cancel
Save