2

私は2つのスレッドを開始するサーバークラスを持っています.1つはすべての着信接続を受け入れ、それらのソケットをベクトルに入れることです。もう 1 つは、このソケット ベクトルをスキャンして、読み取り/書き込み用に読み取られたものを見つけてから、何かを実行することです。

問題は、2 番目のスレッド (メンバー関数) で、これらのソケットを実際にスキャンするにはどうすればよいかということです。

人々は unix ソケットの select() を使用することを提案していますが、私はどこでもブーストを使用することに決めたので、ブーストで解決策を探しています。

boost.org とこのサイトからいくつかのドキュメントを読みました。人々は、io_service は select の抽象であると言いました。理解できない。関数/オブジェクトをバインドしてから、io_service::post() を使用してそれらをキューに入れ、io_service::run() を使用して実行しますか?


私の理解では、io_service オブジェクトを含むコンストラクターを使用して新しいソケット オブジェクトをインスタンス化するたびに、io_service オブジェクトが 1 つしかないため、このソケット オブジェクトは io_service オブジェクトに関連付けられます。io_service を呼び出すと、これらのソケット オブジェクトが実行されます。走る()

しかし、問題は、これらのソケットに handle_function をどのように割り当てるかです。私は人々がこのように acceptor.async_accept(socket, boost::bind(handler, &socket)) を使用しているのを見ました.ただし、accept() 関数を使用してハンドラー関数をこのソケットにバインドすることはできません

私は何をすべきか?

class Server
{
  io_service IOService;

  std::vector<boost::....::socket> SocketVector;

  listen()

  {
    //blockingly accept all incoming connection and bind socket with handler function;
  }

  process HandleRequest()
  {
    //io_service.run()
  } 
}

int main()
{
    Server myServer;
    boost::thread thread1(&Server::listen, &myServer);
    boost::thread thread2(&Server::HandleRequest, &myServer);
}
4

1 に答える 1

0

あなたのデザインは複雑すぎて、Boost Asio とうまく統合できない可能性があります。はい、すべてのソケットにスレッドを使用できますが、同時接続が少数を超えるとすぐにバラバラになります。

設計を再考し、非同期操作に基づいて設計することをお勧めします。asio のドキュメントに含まれている例を調べてください。タグにもたくさんの情報があります。

于 2013-04-13T16:08:22.223 に答える