Буст :: asio tcp блокировка выключения сокета или нет? - PullRequest
3 голосов
/ 04 ноября 2011

boost :: asio TCP-сокет принимает / читает / записывает все обеспечивает асинхронную версию, но не отключение.

В моем коде я просто вызываю socket.close (), и большую часть времениэто работает отлично.Это вызвало постепенное отключение TCP.

Но иногда close () просто закрывает сокет без отключения TCP.В результате я должен вызвать shutdown () вместо этого.Но я не хочу блокировать мой код.Shutdown () блокируется в boost: asio?Как насчет close ()?Блокировка close ()?

1 Ответ

3 голосов
/ 07 ноября 2011

Прежде всего, вызовы shutdown() и close() в Boost.Asio вызывают базовую реализацию сокета BSD.Так что в вызовах Asio shutdown () или close () нет ничего «особенного».

  • shutdown() не блокируется.Обычно он используется для отключения отправки / получения или обоих (т. Е. Для отправки EOF на другой конец).Он НЕ разрушит сокет (т.е. ресурс сокета НЕ освобождается)

  • close() освободит ресурс сокета.Он также может блокироваться в зависимости от опции SO_LINGER.Но SO_LINGER - хитрый зверь, чтобы убедить вас: http://lists.freebsd.org/pipermail/freebsd-questions/2004-June/049093.html и http://developerweb.net/viewtopic.php?id=2982. Однако, если вы используете неблокирующие сокеты (то есть O_NONBLOCK, то, что Boost.Asio действительно обернутовокруг), затем close () не блокируется.

Дальнейшее чтение:

http://linux.die.net/man/3/shutdown http://linux.die.net/man/3/close

А если вы Windows: http://msdn.microsoft.com/en-us/library/windows/desktop/ms738547%28v=vs.85%29.aspx (читайте комментарии, очевидно, документированные методы изящного выключения не работают все время ..)

...