Golang UDP服务器的奇怪行为
我在go中编写了一个简单的UDP服务器。
当我这样做时,go run udp.go
它会打印我发送给它的所有包裹。但是,当客户端停止运行时,go run udp.go >
out它将停止传递stdout
到out
文件。
客户端是发送10k请求的简单程序。因此,在文件中,我大约有50%的已发送软件包。当我再次运行客户端时,out
文件会再次增长,直到客户端脚本完成。
服务器代码:
package mainimport (
"net"
"fmt"
)
func main() {
addr, _ := net.ResolveUDPAddr("udp", ":2000")
sock, _ := net.ListenUDP("udp", addr)
i := 0
for {
i++
buf := make([]byte, 1024)
rlen, _, err := sock.ReadFromUDP(buf)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(buf[0:rlen]))
fmt.Println(i)
//go handlePacket(buf, rlen)
}
}
这是客户端代码:
package mainimport (
"net"
"fmt"
)
func main() {
num := 0
for i := 0; i < 100; i++ {
for j := 0; j < 100; j++ {
num++
con, _ := net.Dial("udp", "127.0.0.1:2000")
fmt.Println(num)
buf := []byte("bla bla bla I am the packet")
_, err := con.Write(buf)
if err != nil {
fmt.Println(err)
}
}
}
}
回答:
如您所怀疑,由于UDP的性质,似乎
。由于UDP是无连接的,因此客户端不关心服务器是否可用或准备接收数据。因此,如果服务器忙于处理,它将无法处理下一个传入的数据报。您可以进行检查netstat
-u(其中应包括UDP数据包丢失信息)。我遇到了同样的事情,服务器(接收端)无法跟上发送的数据包的速度。
您可以尝试两种方法(第二种方法适用于您的示例):
确保接收套接字具有足够的缓冲以处理您向其抛出的所有内容。
sock, _ := net.ListenUDP("udp", addr)sock.SetReadBuffer(1048576)
尝试通过确保服务器在希望接收时不忙于其他工作来每秒增加数据报。即,将处理工作移至go例程,因此您无需按住ReadFromUDP()。
//Reintroduce your go handlePacket(buf, rlen) with a count paramfunc handlePacket(buf []byte, rlen int, count int)
fmt.Println(string(buf[0:rlen]))
fmt.Println(count)
}
…
go handlePacket(buf, rlen, i)
最后一种选择:
最后,可能不是您想要的,您 中 这会减慢速度并消除问题。例如
buf := []byte("bla bla bla I am the packet")time.Sleep(100 * time.Millisecond)
_, err := con.Write(buf)
以上是 Golang UDP服务器的奇怪行为 的全部内容, 来源链接: utcz.com/qa/421187.html