Форум программистов, компьютерный форум, киберфорум
Наши страницы

"Настоящий" TCP KEEPALIVE (Win\Lin)(server)

Войти
Регистрация
Восстановить пароль
Рейтинг: 4.00. Голосов: 1.

"Настоящий" TCP KEEPALIVE (Win\Lin)(server)

Запись от saqef размещена 27.10.2017 в 13:09

Протестировано на win 8.1/10, ubuntu 16.04
(qt 5.9.1)

Да, есть встроенная опция KEEPALIVE, но с ней соединение "прозванивается" раз в два часа,
что может быть недостаточно.
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 QTcpSocket* clientSocket=tcpserver->nextPendingConnection();
#ifdef Q_OS_WIN
 
    DWORD dwError = 0L,dwBytes ;
    tcp_keepalive pClSock_tcpKeepalive;
    pClSock_tcpKeepalive.onoff=1;//turn keepalive
    pClSock_tcpKeepalive.keepalivetime=1000;// every 1 sec sent a package
    pClSock_tcpKeepalive.keepaliveinterval=1500;// if doesn't get a answer sent again after 1.5 sec
    if (WSAIoctl(clientSocket->socketDescriptor(), SIO_KEEPALIVE_VALS, &pClSock_tcpKeepalive,sizeof(pClSock_tcpKeepalive),NULL,0, &dwBytes,NULL, NULL) != 0)
    {
        dwError = WSAGetLastError() ;
        char *err=NULL;
        //qWarning((char*)dwError);
        memcpy(err,&dwError,sizeof(dwError));
        qWarning(err);
    }
#else
    int fd = clientSocket->socketDescriptor();
    int enableKeepAlive = 1;
    setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &enableKeepAlive, sizeof(enableKeepAlive));
    int max_idle = 10;     //The time (in seconds) the connection needs to remain idle before TCP starts sending keepalive probes, if the socket option SO_KEEPALIVE has been set on this socket.  This option should not be used in code intended to be portable.
    setsockopt(fd, SOL_TCP, TCP_KEEPIDLE, &max_idle, sizeof(max_idle));
    int keep_count = 5;     //The maximum number of keepalive probes TCP should send before dropping the connection.  This option should not be used in code intended to be portable.
    setsockopt(fd, SOL_TCP, TCP_KEEPCNT, &keep_count, sizeof(keep_count));
    int keep_interval = 2;     // The time (in seconds) between individual keepalive probes.This option should not be used in code intended to be portable.
    setsockopt(fd, SOL_TCP, TCP_KEEPINTVL, &keep_interval, sizeof(keep_interval));
#endif


Если пишете не под Qt просто поменяйте Qt-шные типы на свои.
Размещено в Без категории
Просмотров 138 Комментарии 0
Всего комментариев 0

Комментарии

 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru