Требуется довольно много времени, чтобы socket.read_some вернулся после вызова socket.close в linux - PullRequest
3 голосов
/ 10 мая 2011

Я использую Boost.Asio как простую библиотеку сокетов.

Когда я открываю сокет, я создаю поток, который продолжает чтение в этом сокете и возвращает, когда сокет был закрыт, или некоторыепроизошли другие ошибки.

while((read = socket->read_some(buf, ec)) != 0) {
    // deal with bytes read
}

Этот код хорошо работает на Windows и Mac.Однако в linux, когда сокет закрывается от основного потока, для возврата socket::read_some требуется довольно много времени - я обнаружил, что это более 2 минут.

Могу ли я что-нибудь сделать, чтобы улучшить это?

Ответы [ 2 ]

2 голосов
/ 11 мая 2011

Наконец-то я нашел причину: в Linux, если вы закрываете сокет с помощью socket :: close, сокет не закрыт.Вы должны закрыть сокет изящно , чтобы закрыть его успешно .

socket->shutdown(shutdown_both); // add this
socket->close();
2 голосов
/ 10 мая 2011

Если вы хотите отменить способность , используйте асинхронные сокеты.Не используйте синхронные методы, такие как read_some.Это обсуждалось до бесконечности в списке рассылки asio-users.Там также есть билет на баг-трекере, обсуждающем его.

Также см. мой ответ на похожий вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...