```
func main() {
// listen to incoming udp packets
udpServer, err := net.ListenPacket("udp", ":1053")
if err != nil {
log.Fatal(err)
}
defer udpServer.Close()
buf := make([]byte, 1024)
for {
//buf := make([]byte, 1024)
n, addr, err := udpServer.ReadFrom(buf)
if err != nil {
continue
}
tmp := buf[:n]
fmt.Println("tmp====", len(tmp), cap(tmp), hex.EncodeToString(tmp))
go response(udpServer, addr, tmp)
}
}
func response(udpServer net.PacketConn, addr net.Addr, buf []byte) {
fmt.Println(len(buf), string(buf), hex.EncodeToString(buf))
time := time.Now().Format(time.ANSIC)
responseStr := fmt.Sprintf("time received: %v. Your message: %v!", time, string(buf))
udpServer.WriteTo([]byte(responseStr), addr)
}```
一个 udp 的客户端发送 "hello" 到这个 udp的服务器,同时期望会正确的显示 hello.
但是由于 response 会被操作系统在不可预知的情况下调度,或者说这个 hello 对应的 response 执行了 len(buf)后被操作系统挂起
另一个 udp 的客户端发送 "world" 到这个 udp的服务器,此时前面的那个 response 被操作系统重新调度,此时会打印出 "world",而不是预期的 "hello" ,不知道我判断对不对
多调多谢
我在本地使用特定字符串休眠的方法测试了一下,确实是像你说的那样的,我也是新手,如果有错请大佬们指正
![gotest.png](https://static.golangjob.cn/230517/ee130447085850bc4fe158eff344286c.png)
#1
更多评论
这样写就没有问题了
tmp := make([]byte, n)
copy(tmp, buf[:n])
go response(udpServer, addr, tmp)
你也可以参数其他办法,避免多groutine 数据竞争就行了。
#2