ブーストソケット/アクセプタは同じポートでリッスン/接続できません。

私はBoostに少し新しかったですが、私は特定のポート上のクライアントからの接続を受け入れることができるサーバーを作成しようとしています。このサーバーは、同じポート上のクライアントにも書き込むことができます。

しかし、 acceptor_.bind()/ acceptor_.listen() socket_.connect(* iterator)の両方を実装しようとすると、 >無効な関数エラーで async_accept()が失敗します。

acceptor_.listen()を使用してソケット(サーバーからクライアントへ)に書き込むことができるのは、 acceptor_.bind() ()

acceptor_.connect()(ただし、 acceptor_.bind() acceptor_.listen())を使用するだけで、 async_read_some()を使用してソケット(クライアントからサーバーに送信されたデータ)を読み込みます。

別のソケットオブジェクトを作成するか、別のポートを選択する必要がありますか?私は再利用アドレスをTrueに設定して有効にしました。

1
あなたのコードを言葉で表現するのではなく、あなたが記述した問題を示す完全なコードを投稿してください。
追加された 著者 Sam Miller,

2 答え

どうしてあなたのサーバーに既に接続されているクライアントに connect()しようとしていますか?その接続で受け入れられた既存のソケットに書き込むだけです。

2番目の接続をクライアントに接続(たとえば、FTPプロトコルがデータ転送の場合と同じように)する必要がある場合は、そのソケットをバインドするポートを指定しないでください。 OSが使用する適切なポートを決定させる。

2
追加された
あなたは絶対に正しい!聞いて接続する必要はありませんでした。ちょうど接続されていて、非同期に読み書きがうまく動作しました。本当にありがとう!
追加された 著者 user_48349383,

あなたがネットワークプログラミングのいくつかの基本的な概念を把握していないようですが、これはブーストやAsioライブラリとは無関係です。一般にサーバーは accept()を呼び出し、クライアントは connect()を呼び出します。 asioの例はこれを詳細に示しています。

そして、サーバーが

  • async_accept()
  • async_read_some()
  • async_write()

クライアントは、

  • connect()
  • write()
  • read()