1

Boostライブラリを使用してWindows PCとasioスタンドアロンライブラリを使用してLinux ARMビーグルボードとの間で通信するサーバーとクライアントプログラムをプログラミングしています。しばらくの間、2 つのデバイス間の UDP 通信が成功していましたが、クライアントが接続したときにサーバーが検出したエンドポイントからポートを回復したいと考えています。クライアントが接続する方法は、クエリを使用することです。

udp::resolver resolver(io_service);
udp::resolver::query query_tx(udp::v4(), hostIP, "43210");
udp::endpoint receiver_endpoint_tx = *resolver.resolve(query_tx);

ここで、ホスト IP は文字列であり、これは正常に機能します。デバッグ時に、返された値を確認すると、次のようになります。

receiver_endpoint_tx.port()

これは 51880 を返します。ネットワーク バイト オーダーとホスト バイト オーダーを大声で叫ぶのはやめましょう。私は承知しています。奇妙な部分は、この番号 51880 が異なる番号である場合があり、サーバーがエンドポイントに保存したものを確認すると、まったく異なる番号である 21743 であるということです。バイトオーダーで何か間違ったことをしているに違いないことがわかりましたが、試しました:

//unsigned long port_long       = boost::asio::detail::socket_ops::host_to_network_long(receiver_endpoint_tx.port());
//unsigned long port_short      = boost::asio::detail::socket_ops::host_to_network_short(receiver_endpoint_tx.port());

そして、元のポート番号 43210 を返してくれません。ホストへのネットワークも返しません。それで、私は何が欠けていて、どうすれば両端で43210ポートを回復できますか? 彼らは正常に通信しているので、明らかにどこかにあるに違いありません。事前に感謝します。noob の間違いがあれば申し訳ありません :)

4

1 に答える 1

3

まず、UDP はコネクションレスであり、接続がありませ

私があなたを正しく理解しているかどうかはわかりませんが、特定のポート番号にバインドしたいように思えます。クライアントがポート x からサーバーのポート y にパケットを送信し、サーバーがポート y からポート x に応答する必要がある場合は、ソケットを目的のポートにバインドする必要があります。または、コンストラクターを使用してバインドすることもできます。そうしないと、OS がエフェメラル ポートを使用することになります。

さらに、 からパケットを受信したリモート エンドポイントを取得するにasync_receive_fromは、sender_endpoint参照パラメーターを使用します。読み取りハンドラーが呼び出されると、そこからホストとポートを取得できます。

于 2013-03-05T07:28:25.223 に答える