3

ブーストドキュメントから公式の非同期UDPサーバーの例を見ました。そこで単一の udp ソケットを作成し、それをローカル ポートにバインドして、次のようにします。

socket(ioService, boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(), port))

socket.async_receive_from(buffer(data, max_length), senderEndpoint, boost::bind(&Request::HandleReceiveFrom, this,
    boost::asio::placeholders::error,
      boost::asio::placeholders::bytes_transferred));

を使用して別のソケットを作成しようとすると、クライアントからの複数の同時udp接続を処理するにはどうすればよいですか

socket(ioService, boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(), port))

同じポートにバインドされたソケットが既にあるため、バインド エラーが発生します。

編集 別のサーバー送信元ポートを使用してクライアントに応答を返すことができますが、応答を同じクライアント ip/クライアント宛先ポートに送り返しても、応答を認識しません。

4

3 に答える 3

5

UDP はコネクションレス トランスポートであるため、UDP に関する限り、接続の概念は無意味です。

メッセージの発信者にデータを送り返したい場合は、async_receive_from コールバックで返された sender_endpoint のコピーを保持し、それを async_send_to で返す必要があります。

これは、クライアントもポーリング/読み取りを行っており、応答を期待していることも前提としています。サーバーと同じバインドされたポートでリッスンする必要はありません (クライアント側で UDP にバインドする必要はありません)。

ブースト ASIO の内部で何が起こっているのかを理解するために、Beej のネットワーク プログラミング ガイドを読むことをお勧めします。ASIOをブーストすると、物事が非常に複雑になります。

http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html#sendtorecv

于 2012-09-09T21:28:05.253 に答える
1

クライアントがサーバー上の同じポートにメッセージを送信する場合、それらを区別する唯一の方法は、リモート ポートまたはリモート ポートとリモート IP の組み合わせによるものです。

pair<remote_ip, remote_port>クライアント ID (例: ) からディスパッチャ タイプ (例: ) への何らかのマッピングを作成しますmap< pair<remote_ip, remote_port>, dispatcher>。次に、同時リクエストをサポートするためにスレッド化するのはあなた次第です。

于 2012-08-28T08:39:57.660 に答える
1

解決策は、クライアントに応答を返すために同じソケットを使用することです。この質問の回答を見てください:非同期受信/送信に同じ udp ソケットを使用する

于 2012-09-15T18:02:00.700 に答える