udp echo server
1.0.0
Go 中的玩具 UDP 服务器和客户端。我这样做是为了熟悉 Go 的标准包net
,特别是与 UDP 相关的函数。
因为我在写的时候了解到,server.go 如何处理 UDP 套接字和 client.go 如何处理一些“通用”套接字事情之间存在奇怪的风格不匹配。为了解决这种不匹配问题,我在 client2.go 中仅使用 UDP 函数来匹配 server.go。
我还添加了一个 Python 3 客户端,因为我没有其他地方可以放置它。
服务器侦听特定端口号上的 UDP 数据包。它阻止net.ReadFromUDP()
方法调用。
如果服务器接收到字节,它会打印出从哪里接收到的字节数,然后将相同数量的字节写回到从哪里接收到的字节数。
客户端根据命令行信息创建到某个 IP(v4 或 v6)或主机名和端口号的 UDP 连接。然后,它也从命令行将字符串字节写入 UDP 连接。它会等待,直到一些字节返回,或者发生错误。那么它就存在了。
简单,但又充满问题。没有超时,没有设置字节数。客户端或服务器可能会永远挂起,等待永远不会到达的数据包。
$ go build server.go
$ go build client.go
$ go build client2.go
python 3客户端是解释性的,不需要“构建”。
在窗口 1 中:
$ ./server :: 7890
Accepting a new packet
在窗口 2 中:
$ ./client udp localhost 7890 'some string'
或者:
$ ./client2 fe80::a11:96ff:fe7f:6d74 7890 'some string' [eth0]
或者:
$ ./client1.py localhost 7890 'some string'
./client2
的最后一个参数是可选的。它是路由数据包所通过的网络接口的名称。注意net.UDPAddr
的内容:
type UDPAddr struct {
IP IP
Port int
Zone string // IPv6 scoped addressing zone
}
Zone 元素用于路由本地链路地址(fe80:前缀)。接口名称作为区域。使用第四个参数调用时, client2
使用该参数作为“区域”。