2016-05-27 27 views
1

クライアントが接続するために特定のポートで待機するTCPサーバーがあります。Boost :: ASIO:複数のスレッドでtcp :: socketを使用する

クライアント接続が1つの場合は、asio::io_servicetcp::socketオブジェクトを作成し、そのソケットを受け入れます。例:

void Gateway::server(boost::asio::io_service& io_service, unsigned short port) { 
    tcp::acceptor a(io_service, tcp::endpoint(tcp::v4(), port)); 
    bool UARTToWiFiGatewayStarted = false; 

    for (;;) { 
     tcp::socket sock(io_service); 

     a.accept(sock); 

     std::thread(startWiFiToUARTSession, std::move(sock)).detach(); 

     if(false == UARTToWiFiGatewayStarted) { 
      //std::thread(startUARTToWifiSession, std::move(sock2)).detach(); 
      UARTToWiFiGatewayStarted = true; 
     } 
    } 
} 

今私は1つのスレッドがソケット(read_some(...))から(ブロッキング)読みになり、他のスレッドがあることを利用して(ブロック)のデータを書き込む必要があり、少なくとも二つのスレッド上でこのソケットの機能を使用したいですソケット。

同じasio::io_serviceオブジェクトを使用して2つのtcp::socketオブジェクトを作成しようとしましたが、動作しません。

アイデア?

+1

"うまくいかない"とはどういう意味ですか? – Xirema

+0

「少なくとも2つのスレッドでこのソケットの機能を使用する」 - 単一のクライアントと同じ接続を意味しますか? –

+1

各 'tcp :: socket'オブジェクトは個別のネイティブソケットを参照する必要があります。単一のTCP接続に二つの 'tcp :: socket'オブジェクトを使いたいという動機づけを説明できますか? –

答えて

2

socketオブジェクトはネイティブソケットの所有権を取得するように設計されており、ネイティブソケットの管理にはRAIIのセマンティクスを提供します。したがって、個々のオブジェクトは個別のネイティブソケットを参照する必要があります。それ以外の場合は、基になるソケットの状態が予期せず変更されることがあります。

socket文書では、1つの共有socketで同時コールを行うと安全でないと指定されていますが、revision historyはこのルールの例外を文書化しています。 ASIO 1.4.0のように/ OS、同期リードによってサポートされている場合、1.37ブースト書き込み、受け入れ、そしてsocketオブジェクトで同時に行われる接続操作は、スレッドセーフである:

ASIO 1.4。 0 /書き込み、1.37

  • ...
  • 同期リードを後押し受け入れ、接続操作は、今ではサポートされている場合、今、個々のソケットに同時同期操作を実行することが許可されていることを意味する(スレッドセーフですOS)。この場合
  • ...

OSでサポートされている場合、同期1つのスレッドでソケットから読み込むためのスレッドセーフで、同期別のスレッドで同時に同じソケットに書き込みます。

関連する問題