void tcp_socket::enable_keep_alives(const fc::microseconds& interval) { if (interval.count()) { boost::asio::socket_base::keep_alive option(true); my->_sock.set_option(option); #if defined _WIN32 || defined WIN32 || defined OS_WIN64 || defined _WIN64 || defined WIN64 || defined WINNT struct tcp_keepalive keepalive_settings; keepalive_settings.onoff = 1; keepalive_settings.keepalivetime = (ULONG)(interval.count() / fc::milliseconds(1).count()); keepalive_settings.keepaliveinterval = (ULONG)(interval.count() / fc::milliseconds(1).count()); DWORD dwBytesRet = 0; if (WSAIoctl(my->_sock.native(), SIO_KEEPALIVE_VALS, &keepalive_settings, sizeof(keepalive_settings), NULL, 0, &dwBytesRet, NULL, NULL) == SOCKET_ERROR) wlog("Error setting TCP keepalive values"); #elif !defined(__clang__) || (__clang_major__ >= 6) // This should work for modern Linuxes and for OSX >= Mountain Lion int timeout_sec = interval.count() / fc::seconds(1).count(); if (setsockopt(my->_sock.native(), IPPROTO_TCP, #if defined( __APPLE__ ) TCP_KEEPALIVE, #else TCP_KEEPIDLE, #endif (char*)&timeout_sec, sizeof(timeout_sec)) < 0) wlog("Error setting TCP keepalive idle time"); # if !defined(__APPLE__) || defined(TCP_KEEPINTVL) // TCP_KEEPINTVL not defined before 10.9 if (setsockopt(my->_sock.native(), IPPROTO_TCP, TCP_KEEPINTVL, (char*)&timeout_sec, sizeof(timeout_sec)) < 0) wlog("Error setting TCP keepalive interval"); # endif // !__APPLE__ || TCP_KEEPINTVL #endif // !WIN32 } else { boost::asio::socket_base::keep_alive option(false); my->_sock.set_option(option); } }
inline void pack( Stream& s, const fc::microseconds& usec ) { uint64_t usec_as_int64 = usec.count(); s.write( (const char*)&usec_as_int64, sizeof(usec_as_int64) ); }