1

次の UDP プロトコルを実装しようとしていますが、これにどのようにアプローチすべきかを正確に理解するのに少し苦労しています。

プロトコルは、特定の UDP パケットを特定のサーバーに送信する必要があることを示しています。その後、サーバーは (関連する複数の UDP パケット) をストリーミングして、これも UDP パケットとして私に返します。次のコードを使用して、UDP パケットを正常に送信できました。

connection, error := net.DialUDP("udp", nil, endpoint)
...
if written, error := connection.Write(query.ToBytes()); error != nil {
    ...
} else {
    log.Printf("Successfully wrote %d bytes to %s", written, connection.RemoteAddr())
}

Wireshark を使用して、ネットワーク上で何が起こっているかを調べると、パケットが問題なく送信されたように見えます (ここでの唯一の問題は、サーバーから応答がないことですが、それはこの質問とは関係ありません)。

この場合、サーバーの応答を処理する最善の方法は何ですか? 以前に確立connectionしたものを使用してサーバーの応答を読み取ることはできますか (UDP はコネクションレスであるため、これは私にはありそうにありません)、またはnet.ListenUDP(...)サーバーが返すものを読み取るために正しいローカル アドレスとポートでサーバーを確立するために使用する必要がありますか?

4

2 に答える 2

1

プロトコルの意図は、リクエストの送信に使用したのと同じ UDP ソケットを使用して応答を受信することであることは明らかです。クライアント側のファイアウォールがある場合は、UDP ポートを明示的に開き、UDP ソケットをそのポートにバインドしてから送信する必要があります。それ以外の場合は、バインドをまったく行わずに、システムにローカル ポートを選択させます。

「最初のパケットによって確立されたのと同じポート」という表現は誤解を招きます。それらはあなたの言葉ですか、それともプロトコル仕様ですか? 最初の送信を行ったときに実際に起こることは、ソケットをまだバインドしていない場合、ポート 0 にバインドした場合とまったく同じように、システムが選択したポートに自動的にバインドされることです。

于 2012-09-16T09:41:32.120 に答える
0

特定のプロトコル設計のため、サーバーが応答パケットを送信するポートを知ることは不可能です。パケット ダンプをもう一度見てみると、実際にはサーバー応答していることに気付きました。クライアントだけが、すぐにDestination port unreachable. そのため、サーバーは応答しようとしましたが、クライアントがそのポートでパケットを受け入れないため、応答できませんでした。

これを解決するためnet.ListenUDPに、クライアントが確立された接続のローカル アドレスを使用して最初のパケットを送信した直後に着信パケットをリッスンしていました。

incomingConnection, _ := net.ListenUDP("udp", connection.LocalAddr().(*net.UDPAddr))
log.Printf("Listening for packets on %s", incomingConnection.LocalAddr())
defer incomingConnection.Close()

その後、たとえば、サーバーが送信しているパケットを読み取るためincomingConnectionに使用できます。Reader

于 2012-09-16T08:24:30.320 に答える