接続されたデータグラムソケットを外し、再接続します
-
06-09-2019 - |
質問
IAMがデータグラムソケット(UDP)に基づく反復サーバーを作成しようとしています。 それは最初のrecvfrom()の呼び出し(はい、私はこれが本当接続されていません知っている)から取得する最初のクライアントに接続を呼び出します。 このクライアントを務めた後、私は(AF_UNSPECと接続呼び出し)UDPソケットを外してください それから私は、次のクライアントからの最初のパケットを取得するためのrecvfrom()を呼び出します。
さて問題は、ループの2回目の繰り返しでのrecvfrom()の呼び出しは空パケットを送信することはありません0.私のクライアントを、返却されていること、その上で行くことができるか。
このIAMのがやって何である(擬似コード):
s = socket(PF_INET, SOCK_DGRAM, 0)
bind(s)
for(;;)
{
recvfrom(s, header, &client_address) // get first packet from client
connect(s,client_address) // connect to this client
serve_client(s);
connect(s, AF_UNSPEC); // disconnect, ready to serve next client
}
編集:私は誤って空のパケットを送信し、私のクライアントのバグを発見しました。 今、私の問題は、クライアントがどこ(サーバが別のクライアントに接続されており、まだ他のクライアントにサービスを提供しません)に要求を送信する代わりに務め得るために待つようにする方法である。
解決
SOCK_DGRAMに本当にある)(完全に不要に接続します。
の呼び出し<デル>あなたは他のホストデル>からパケットの受信を停止せず、また、それはあなたがそれらの送信を停止ん接続します。ただ、それは本当に便利ではないですが、気にしないでください。
訂正:はい、どうやらそれはあなたが他のホストからのパケットの受信を停止ありません。しかし、あなたが接続している間、他のクライアントがロックアウトされてしまうため、サーバーでこれを行うことは少し愚かである()1に編。また、あなたはまだ周りに浮かぶ「チャフ」をキャッチする必要があります。 DGRAMソケットに接続()に関連付けられているいくつかの競合状態は、おそらくあります? - あなたが接続して呼び出し、他のホストからのパケットがバッファ内にすでにある場合、何が起こる
空の(データなし)パケットが有効であると(実際に、人々はしばしばそれらを使用する)が存在することができますように、また、0のrecvfrom()から有効な戻り値は、です。だから、何かがそのように成功したかどうかを確認することはできません。
すべての可能性では、ゼロバイトのパケットがすでにキューにあった。
あなたのプロトコルが誤解されている誤ったデータグラムの機会を最小限に抑えるように設計されなければなりません。このような理由のために私はあなたが空のデータグラムを使用して、代わりにマジックナンバーを使用しないことをお勧めしたい。
UDPアプリケーションは、「チャフ」パケットを認識し、それらをドロップすることが可能でなければなりません。彼らは遅かれ早かれアップになります。
他のヒント
man connect
ます:
... If the initiating socket is not connection-mode, then connect() shall set the socket’s peer address, and no connection is made. For SOCK_DGRAM sockets, the peer address identifies where all datagrams are sent on subsequent send() functions, and limits the remote sender for subsequent recv() functions. If address is a null address for the protocol, the socket’s peer address shall be reset. ...
私が行ったように、誰もがこの全体にstumbples場合にだけ修正。 ()を接続し切断することがAF_UNSPECに設定のsockaddrのsa_familyフィールドと呼ばれることが必要です。ただAF_UNSPECに合格していません。