// подключаем Ws2_32.lib в проект (иначе будут unresolved'ы)#include <winsock2.h> // библиотека работы с портами// не нашёл константы на msdn. Кому интересно привожу ссылку// http://msdn.microsoft.com/en-us/library/windows/desktop/dd877220(v=vs.85).aspx. Видимо часть библиотеки windows. :)#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)// собственно сама управляющая структураstruct tcp_keepalive {u_long onoff; // включение /отключениеu_long keepalivetime; // время жизниu_long keepaliveinterval; // время повторного запроса.};// этот кусок уже внутри слота connected(). Выполняется только при уже установленном подключении.{ // pClientSocket - заменить на ваш QTcpSocket DWORD dwError = 0L,dwBytes ; tcp_keepalive pClSock_tcpKeepalive={0}, sReturned = {0}; // заполняем структуру pClSock_tcpKeepalive.onoff=1;//включить keepalive pClSock_tcpKeepalive.keepalivetime=1000;// каждую "1.000" секунду отсылать пакет pClSock_tcpKeepalive.keepaliveinterval=1500;// Если не пришел ответ выслать через 1.5с повторно if (WSAIoctl(pClientSocket->socketDescriptor(), SIO_KEEPALIVE_VALS, &pClSock_tcpKeepalive, sizeof(pClSock_tcpKeepalive), &sReturned, sizeof(sReturned), &dwBytes, NULL, NULL) != 0) { dwError = WSAGetLastError() ; qWarning((char*)dwError); }}
#include <sys/socket.h>#include <netinet/tcp.h> void setKeepAlive(int socketDescriptor, int state, int idle, int interval){ setsockopt(socketDescriptor, SOL_SOCKET, SO_KEEPALIVE, (void*)&state, sizeof(state)); setsockopt(socketDescriptor, SOL_TCP, TCP_KEEPIDLE, (void*)&idle, sizeof(idle)); setsockopt(socketDescriptor, SOL_TCP, TCP_KEEPINTVL, (void*)&interval, sizeof(interval));}