我为 tcp 和 udp 连接编写了简单的服务器和客户端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}并得到一个奇怪的行为:并非所有 udp 请求都在许多连接上发送或处理。当我发送 100 或 200 时,服务器和客户端都告诉我所有请求都有效,但从 1000 开始,服务器和客户端的 udp 请求丢失了大约 5%,但没有恐慌。我知道 udp 允许数据包丢失,但 5% 的本地主机请求似乎是一个错误。
1 回答
桃花长相依
TA贡献1860条经验 获得超8个赞
我们知道,UDP是无连接的,所以丢包可能就是UDP的这种特性造成的。可以有多种方法来降低数据包丢失率。
降低客户端发送数据包的速率
调用
SetWriteBuffer
增加客户端缓冲区大小并设置SetReadBuffer
增加服务器端缓冲区大小
conn, err := net.DialUDP("udp", nil, addr) err = conn.SetWriteBuffer(64 * 1024 * 1024)
- 1 回答
- 0 关注
- 108 浏览
添加回答
举报
0/150
提交
取消