gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:19:11 24 4
gpt4 key购买 nike

我用 Go 编写了一个 UDP 服务器和客户端。当服务器在 port 1200 上运行时,我没有看到任何错误消息,当客户端尝试连接到同一台机器上的 1200 端口时,我也没有看到任何错误 (OS X 10.9.1)

服务器不在无限循环中打印“SOS...”,即客户端正在写入的消息。

虽然客户端能够向服务器发送消息,但是服务器读取的是 0 字节。

服务器代码

package main

import ( "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 :1200go run udp-client.go 127.0.0.1:1200

package main

import (
"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
}

fmt.Println("Connected to server at ", service)

defer conn.Close()

fmt.Println("About to write to connection")

for {

time.Sleep(1000*time.Millisecond)
n, err := conn.Write([]byte("SOS ... \n"))
if err != nil {
fmt.Println("error writing data to server", service)
fmt.Println(err)
return
}

if n > 0 {
fmt.Println("Wrote ",n, " bytes to server at ", service)
}
}

}

最佳答案

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

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

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

关于Go中的UDP服务器/客户端不读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20730891/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com