Повысьте разблокировку аксиоприемника без нового подключения? - PullRequest
4 голосов
/ 20 июня 2011

Я использую C ++ Boost Asio Library, где я слушаю новые соединения на сокете. При получении соединения я обрабатываю запрос и затем прослушиваю новое соединение в другом сокете в цикле.

while (true)
{
    tcp::socket soc(this->blitzIOService);
    this->blitzAcceptor.listen();
    boost::system::error_code ec;
    this->blitzAcceptor.accept(soc,ec);
    if (ec)
    {
        // Some error occured
        cerr << "Error Value: " << ec.value() << endl;
        cerr << "Error Message: " << ec.message() << endl;
        soc.close();
        break;
    }
    else
    {
        this->HandleRequest(soc);
        soc.shutdown(tcp::socket::shutdown_both);
        soc.close();
    }
}

Насколько я понимаю, он всегда должен блокироваться в this-> blitzAcceptor.accept (soc, ec); и каждый раз, когда устанавливается новое соединение, он должен обрабатывать его в this-> HandleRequest ( soc); и снова блокировать на this-> blitzAcceptor.accept (soc, ec);

Но то, что я вижу, это то, что в первый раз он будет блокироваться в this-> blitzAcceptor.accept (soc, ec) , и когда будет установлено новое соединение, он будет обрабатывать запрос, но вместо этого повторная блокировка в this-> blitzAcceptor.accept (soc, ec) приведет к this-> HandleRequest (soc); и блокированию в soc.receive ( ); внутри.

Это не всегда происходит, но происходит большую часть времени. В чем может быть причина такого поведения, и как я могу гарантировать, что оно всегда блокируется в this-> blitzAcceptor.accept (soc, ec), пока не будет сделан новый запрос?

Ответы [ 2 ]

3 голосов
/ 21 июня 2011

Что может быть причиной этого поведение?

Это поведение полностью зависит от кода клиента. Если он подключается, но не отправляет запрос, сервер с блоком при получении данных.

как я могу гарантировать, что он всегда блокирует at this-> blitzAcceptor.accept (soc, ec) пока не будет сделан новый запрос?

Вы не можете. Но ваш сервер может инициировать тайм-аут, который начинается сразу после принятия соединения. Если клиент не отправляет запрос в течение этого времени, закройте сокет. Для этого вам следует переключиться на использование асинхронных, а не синхронных методов.

1 голос
/ 21 июня 2011

Убедитесь, что вы не блокируете вызов read(2) для дескриптора файла, который вы listen(2) используете против дескриптора файла, который вы accept(2) 'редактировали.Я думаю, что если вы распечатаете номера файловых дескрипторов, вы очень быстро найдете свою проблему.

...