2017-12-14 13 views
0

私はNetworking TSを使って単純なシングルスレッドTCPサーバーを作成しています。着信接続を受け入れるために、std::experimental::net::ip::tcp::acceptorを作成し、acceptメンバー関数を呼び出します。しかし、それは受け入れるための接続がない場合、私はそれを望んでいないブロックします。受諾者が受け入れる準備ができているかどうかを確認する方法basic_socket_acceptorが受け入れる準備ができていることを確認してください。

+1

私は実験的な機能で遊んでいませんが、古いソケットAPIでは、リスニングソケットに保留中の接続があるかどうかを知るためにselectを使用できます。実験的なC++ APIにはおそらくそのための方法があります。 –

+0

使用しているAPIが[boost :: asio](http://www.boost.org/doc/libs/1_65_0/doc/html/boost_asio/reference.html)に基づいていると思いますか?もしそうなら、私はそこに[非同期バージョンの 'accept'](http://www.boost.org/doc/libs/1_65_0/doc/html/boost_asio/reference/basic_socket_acceptor/async_accept.html)をよく –

+0

@SergeBallestaはい、私はそれを認識しています。 – Lyberta

答えて

0

最終的にselectを呼び出す関数がある場合は、race conditionが公開されます。正しい方法は、アクセプタを非ブロッキングに設定することです。

std::experimental::net::io_context context; 
std::experimental::net::ip::tcp::acceptor acceptor{context, 
    std::experimental::net::ip::tcp::endpoint{ 
    std::experimental::net::ip::tcp::v4(), 1234}}; 
acceptor.non_blocking(true); 
std::error_code error; 
while (true) 
{ 
    auto socket = acceptor.accept(error); 
    if (!error) 
    { 
     // Handle incoming connection 
    } 
    // Do other stuff 
} 
関連する問題