我為 tcp 和 udp 連接編寫了簡(jiǎn)單的服務(wù)器和客戶端package main//server.goimport ( "fmt" "net" "os" "os/signal" "syscall")func main() { tcp := 0 udp := 0 defer func(o, t *int) { fmt.Println(*o, *t) }(&tcp, &udp) go func() { l, err := net.ListenTCP("tcp", &net.TCPAddr{ IP: net.ParseIP("0.0.0.0"), Port: 3000, }) if err != nil { panic(err) } b := make([]byte, 24) for { conn, err := l.Accept() if err != nil { continue } n, err := conn.Read(b) if err != nil { continue } r := string(b[:n]) if r == "close" { conn.Close() break } else { _, err = conn.Write([]byte("pong")) if err != nil { continue } } conn.Close() tcp++ } l.Close() }() go func() { conn, err := net.ListenUDP("udp", &net.UDPAddr{ IP: net.ParseIP("0.0.0.0"), Port: 3000, }) if err != nil { panic(err) } b := make([]byte, 24) for { n, addr, err := conn.ReadFromUDP(b) if err != nil { continue } r := string(b[:n]) if r == "close" { break } else { _, err = conn.WriteToUDP([]byte("pong"), addr) if err != nil { continue } } udp++ } conn.Close() }() signals := make(chan os.Signal, 1) signal.Notify(signals, os.Interrupt, syscall.SIGTERM) <-signals}并得到一個(gè)奇怪的行為:并非所有 udp 請(qǐng)求都在許多連接上發(fā)送或處理。當(dāng)我發(fā)送 100 或 200 時(shí),服務(wù)器和客戶端都告訴我所有請(qǐng)求都有效,但從 1000 開始,服務(wù)器和客戶端的 udp 請(qǐng)求丟失了大約 5%,但沒(méi)有恐慌。我知道 udp 允許數(shù)據(jù)包丟失,但 5% 的本地主機(jī)請(qǐng)求似乎是一個(gè)錯(cuò)誤。
去udp請(qǐng)求(數(shù)據(jù)包)丟失
月關(guān)寶盒
2023-03-07 14:30:55