3

私はほとんど何もしない単純なものを持ってboost::asio::ip::tcp::acceptorいます - それは無限ループで接続を受け入れます。次に、接続しようとして同時に実行されている多くのコネクタがあります...

pSocket->async_connect(endpoint, 
        [=](boost::system::error_code error)
        {
            if(!error)
            {
                boost::asio::ip::tcp::no_delay noDelay(true);
                pSocket->set_option(noDelay, error);
                assert(!error);
                std::cout << error.message() << '\n'; // "An invalid argument was supplied"
            }
        });

すべてが無限ループで実行されており、2 つのクライアントと 1 つのサーバーをすべてループバック接続で実行しています。no_delay接続されたソケットでオプションを設定すると、しばらくして(数百回の成功した接続と切断) 、エラーが発生しますAn invalid argument was supplied

ソケットにオプションを設定すると、どのような状況でこのエラーが発生する可能性がありますか? 誰もこれを以前に見たことがありますか?なぜそれが起こっているのか、および/またはそれを修正する方法を知っていますか?

更新: セットset_optionを次のように変更すると...

do
{
    pSocket->set_option(noDelay, error);
} while(error);

...成功します-通常、失敗した後の2回目の試行で。

4

1 に答える 1

2

昨日、set_option を段階的にデバッグしました。set_option は io_service_impl オブジェクトを使用していますが、不良なソケット ポインターが含まれているため、クラッシュします。しかし、ソケットの作成時には、このソケットには何も設定されていないため、この方法でソケットにオプションを設定することはできないと思います。

set_option の前にソケットを開く必要があります。前にこれを試してasync_connectくださいset_option

sock->open(boost::asio::ip::tcp::v4());

Bad file descriptorset_option 呼び出しで、初期化されていないソケットに対してエラーが呼び出されます。

于 2012-10-11T17:46:01.587 に答える