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
使用此參數作為「區域」。