2013-11-25 7 views
1

Поддерживаются как Linux, так и Windows TCP keep-alive. Они могут быть активированы и настроены с помощью (зависящих от системы) вызовов setsockopt, см., Например, this article для случая с Linux. При использовании boost::asio, похоже, поддерживается поддержка сообщений keep-alive, см. the current documentation. Однако эта страница охватывает только ее активацию. В нескольких новых ответах на older post было указано, что Boost недавно добавил средства для настройки тайм-аутов по операциям (что устраняет необходимость в кодах-ветвях setsockopt и #ifdef для разных систем). Тем не менее, recent response все еще предлагает вызовы на родные сокеты.Конфигурирование TCP keep_alive с boost :: asio

Мой вопрос: Как настроить временной интервал и тайм-ауты пакетов keep-alive с помощью boost::asio?

+0

@KillianDS Почту вы цитируете сделки с 'SO_RCVTIMEO 'и' SO_SNDTIMEO'. В текущих вопросах конкретно рассматриваются другие константы. Если вы прочтете ссылку на статью, вы обнаружите, что необработанные параметры в системах Linux - это «TCP_KEEPIDLE» и «TCP_KEEPINTVL». Кроме того, принятый ответ предполагает использование сырых сокетов, которые я явно пытался избежать. – user8472

+0

Нет, это не так, он берет собственный дескриптор, который не совпадает с сырым сокетом. И хотя он может говорить о разных вариантах, чем вы хотите, процедура * точно * одинакова (вы даже приняли очень похожий ответ здесь, который использует те же параметры). – KillianDS

ответ

4

Вы можете настроить таймаут отправки и время приема, используя параметры setsockopt. Вот некоторые зависят от платформы код, чтобы сделать это на обоих окнах и Linux/Unix, пример устанавливает как отправлять и получать таймауты же десять второго значения:

// start IO service  
io_context = new boost::asio::io_context;   

// define a tcp socket object  
tcpsocket = new boost::asio::ip::tcp::socket(*io_context); 

// the timeout value 
unsigned int timeout_milli = 10000; 

// platform-specific switch 
#if defined _WIN32 || defined WIN32 || defined OS_WIN64 || defined _WIN64 || defined WIN64 || defined WINNT 
    // use windows-specific time 
    int32_t timeout = timeout_milli; 
    setsockopt(tcpsocket->native_handle(), SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof(timeout)); 
    setsockopt(tcpsocket->native_handle(), SOL_SOCKET, SO_SNDTIMEO, (const char*)&timeout, sizeof(timeout)); 
#else 
    // assume everything else is posix 
    struct timeval tv; 
    tv.tv_sec = timeout_milli/1000; 
    tv.tv_usec = timeout_milli % 1000; 
    setsockopt(tcpsocket->native_handle(), SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); 
    setsockopt(tcpsocket->native_handle(), SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)); 
#endif 
+1

Таким образом, ответ заключается в том, что 'boost :: asio' позволяет активировать его, но не предлагает никакого способа его настройки. Тогда я пойду с твоим решением. В конце концов, на самом деле не проблема использовать собственные сокеты. – user8472

+2

Действительно - я полагаю, что логическое обоснование заключается в том, что не всякая реализация допускает одни и те же параметры конфигурации, поэтому asio выбирает для пользователя конфигурацию, специфичную для конкретной платформы. – Riot

+0

@ Riot вы видели ответы на http://stackoverflow.com/questions/292997/can-you-set-so-rcvtimeo-and-so-sndtimeo-socket-options-in-boost-asio? Я собирался использовать такое решение, как ваше, но, по-видимому, он не очень хорошо работает с asio ... – kenba

Смежные вопросы