为了账号安全,请及时绑定邮箱和手机立即绑定

Go中的UDP服务器/客户端不读取数据

Go中的UDP服务器/客户端不读取数据

Go
繁星淼淼 2021-06-28 12:57:31
我用 Go 编写了一个 UDP 服务器和客户端。当服务器运行时port 1200,我没有看到任何错误消息,当客户端尝试连接到同一台机器上的端口 1200 时,我也没有看到任何错误(OS X 10.9.1)服务器没有在无限循环中打印“SOS ...”,即客户端正在写入的消息。虽然客户端能够向服务器发送消息,但是服务器读取的是 0 字节。服务器代码package mainimport ( "net" "fmt" "time" )func main() {        port := "127.0.0.1:1200"        udpAddress, err := net.ResolveUDPAddr("udp4",port)        if err != nil {                fmt.Println("error resolving UDP address on ", port)                fmt.Println(err)                return        }        conn ,err := net.ListenUDP("udp",udpAddress)        if err != nil {                fmt.Println("error listening on UDP port ", port)                fmt.Println(err)                return        }        defer conn.Close()        var buf []byte        for {                time.Sleep(100 * time.Millisecond)                n,address, err := conn.ReadFromUDP(buf)                if err != nil {                        fmt.Println("error reading data from connection")                        fmt.Println(err)                        return                }                if address != nil {                        fmt.Println("got message from ", address, " with n = ", n)                        if n > 0 {                                fmt.Println("from address", address, "got message:", string(buf[0:n]), n)                        }                }        }}客户端代码,运行在同一台服务器上,使用命令go run udp-client.go :1200或go run udp-client.go 127.0.0.1:1200package mainimport ("fmt""net""os""time")func main() {        if len(os.Args) != 2{                fmt.Fprintf(os.Stderr, "Usage:%s host:port", os.Args[0])                os.Exit(1)        }        service := os.Args[1]        fmt.Println("Connecting to server at ", service)        conn, err := net.Dial("udp",service)        if err != nil {                fmt.Println("Could not resolve udp address or connect to it  on " , service)                fmt.Println(err)                return        }
查看完整描述

1 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

UDPConn.ReadFromUDP方法读取数据,并把它放入您提供的切片。在您的情况下,此切片为零。因此,您的缓冲区没有为数据提供足够的空间。您可以通过更改服务器代码中的一行来解决此问题:

var buf []byte = make([]byte, 1500)

可能应该选择缓冲区大小以适合您的网络协议。或者您创建一个 64k 缓冲区,以便您可以接收最大大小的 udp 数据包。然而,这似乎有点浪费:)


查看完整回答
反对 回复 2021-07-12
  • 1 回答
  • 0 关注
  • 314 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信