1

ローカルエンドポイントにバインドしたいTCPソケットがあります。

私には2つのシナリオがあります:

  1. 使用されておらず、接続を待機していないローカルエンドポイントにソケットを接続します。
  2. 前回の実行で使用された/正しく閉じられていないローカルエンドポイントにソケットを接続します。

以前は、コンストラクターを使用してアクセプターを初期化し、io_serviceとエンドポイントを渡していましたが、使用されているエンドポイントに接続しようとすると、アクセプターがクラッシュしました。

acceptor_(io_service_, endpoint)

次に私がしたことは、コンストラクターを変更してio_serviceのみを取得することです(これにより、ソケットは開かれません)。

acceptor_(io_service_)

asioには、ソケットをローカルエンドポイントにバインドするbind()関数があることがわかりました。関数bind()には、エラーが発生したかどうかを示すパラメーターがありますが、上記の両方のシナリオで同じエラーが返されます。

boost::system::error_code ec;
acceptor_.bind(endpoint, ec);

if(ec)
{
    // SOME ERROR NOTIFYING
// EDIT: error code returned is 10009
}

エンドポイントに接続して、このタイプのエラーに対してさまざまなエラーを取得する方法はありますか?

4

1 に答える 1

2

私が使用したアクセプターのソケットは実際には有効ではありませんでした。

boostのコード(boost asio実装にあります)によると、io_serviceとendpointの両方を受け取るコンストラクターが、エンドポイント自体からのプロトコルを使用してソケットを開き、それをアクセプターにバインドすることを確認しました。

解決策は、io_serviceのみを使用してアクセプターを初期化し、アクセプターを開いて、エンドポイントをそれにバインドすることです。

コメントありがとうございます!

于 2012-07-18T12:53:56.883 に答える