2

boost docsの情報と接続機能のマニュアルを組み合わせると、 asio::udp::socket::connect関数は、デフォルトでデータグラムが送信されるアドレスと、データグラムが受信される唯一のアドレスを設定するのに役立つと思います。

これはうまく機能しますが、マニュアルには、関連付けを解除 (切断) できるはずであると記載されています。これは、私が問題を抱えていることです。つまり、ソケットが任意のアドレスからのパケットの受信を再開するようにしたいと考えています。

さらにマニュアルには次のように書かれています。

Connectionless sockets may dissolve the association by connecting to an
address with the sa_family member of sockaddr set to AF_UNSPEC.

私はこのコードを試しました:

asio::udp::endpoint unspecified_endpoint;
assert(unspecified_endpoint.address().is_unspecified()); // OK
socket.connect(unspecified_endpoint);

しかし、それは役に立ちませんでした。


編集: boost::asio ページからクライアントサーバーの例を取得して、テスト ケースを作成しました。クライアント コードでは、送信ポート番号をランダムから 5192 に変更しました。

udp::socket s(io_service, udp::endpoint(udp::v4(), 5192));

そして、サーバー コードで関数サーバーを変更しました。

void server(boost::asio::io_service& io_service, short port)
{
  udp::socket sock(io_service, udp::endpoint(udp::v4(), port));

#define CASE 3

#if CASE == 1
  sock.connect(udp::endpoint());
#elif CASE == 2
  sock.connect(udp::endpoint(ip::address::from_string("127.0.0.1"), 5193));
  sock.connect(udp::endpoint());
#elif CASE == 3
  sock.connect(udp::endpoint(ip::address::from_string("192.168.1.3"), 5192));
  sock.connect(udp::endpoint());
#endif

  for (;;)
  {
    char data[max_length];
    udp::endpoint sender_endpoint;
    size_t length = sock.receive_from(
    boost::asio::buffer(data, max_length), sender_endpoint);
    sock.send_to(boost::asio::buffer(data, length), sender_endpoint);
  }
}

ケース 1 と 2 は機能しているように見えますが、ケース 3 ではクライアントは応答を受け取りません。完全なソースはここにあります。

4

2 に答える 2

2

コメントで述べたように、への呼び出しはにsock.connect(udp::endpoint());変換し、 withとconnect(6, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("0.0.0.0")}, 16) = 0同じではなく、UDP ソケットを完全に切断しません (ピア ポート番号をリセットするだけのようです)。connectAF_UNSPEC

純粋にブーストasioで目的を達成する方法はないと思いますが、ネイティブPOSIX呼び出しを使用してソケットを切断することができます。

struct sockaddr unspec_addr = { AF_UNSPEC };
::connect(sock.native_handle(), &unspec_addr, sizeof(unspec_addr));

デバッグに関する注意: でプログラムを実行し、UDP ソケットを一覧表示するためにstrace使用します。netstat -nu

于 2012-12-20T10:34:54.897 に答える