Go のおもちゃの UDP サーバーとクライアント。これは、Go の標準パッケージnet
、特に UDP 関連の関数について理解するために行いました。
書いているうちに分かったのですが、server.go が UDP ソケットを実行する方法と client.go が「一般的な」ソケットの処理を実行する方法の間には、奇妙なスタイルの不一致があります。この不一致を調整するために、UDP 関数のみを使用して client2.go を作成し、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: プレフィックス) をルーティングするために使用されます。インターフェイス名はゾーンとして機能します。 4 番目の引数を指定して呼び出されたclient2
、その引数を「ゾーン」として使用します。