У меня есть простая программа в качестве моего клиента, состоящая из tcp-сокета (QTcpSocket). Коды для моего клиента приведены ниже:
while (tcpSocket.data()->waitForConnected(maxWaitingTimeToConnect) == false)
{
tcpSocket.data()->connectToHost(serverIP, serverPort);
if (maxRetryNumberToConnect != -1 && retryNumber++ > maxRetryNumberToConnect)
{
qDebug() << "Socket is disconnected and maximum try for re-connection reached.";
return false;
}
emit sgl_tryToConnect();
// Socket is disconnected and trying to re-connect
QThread::msleep(100);
}
qDebug() << "Client is connected";
qDebug() << tcpSocket.data()->localPort();
auto sd = tcpSocket.data()->socketDescriptor();
NetworkShared::setSocketOption(&sd);
который setSocketOption также указан ниже:
/// Set keepAlive
int enableKeepAlive = 1;
/* Set socket FD's option OPTNAME at protocol level LEVEL
to *OPTVAL (which is OPTLEN bytes long).
Returns 0 on success, -1 for errors. */
qDebug() << setsockopt(*socketDescriptor, SOL_SOCKET, SO_KEEPALIVE, &enableKeepAlive, sizeof(enableKeepAlive));
int maxIdle = 1; /// Seconds
qDebug() << setsockopt(*socketDescriptor, SOL_TCP, TCP_KEEPIDLE, &maxIdle, sizeof(maxIdle));
int count = 1; /// Send up to 1 keepalive packets out, then disconnect if no response
qDebug() << setsockopt(*socketDescriptor, SOL_TCP, TCP_KEEPCNT, &count, sizeof(count));
int interval = 1; /// Send a keepalive packet out every 1 seconds (after the 1 second idle period)
qDebug() << setsockopt(*socketDescriptor, SOL_TCP, TCP_KEEPINTVL, &interval, sizeof(interval));
когда я запускаю свою программу, все выглядит нормально, и для моего сокета будет включена опция поддержания активности. Но это не работает, когда я отключаю кабель на стороне клиента. Ниже я привел свой вывод netstat, который указывает, что таймер поддержки активности включен для моего сокета.
tcp 0 0 192.168.2.157:37281 192.168.2.163:4444 ESTABLISHED keepalive (0.16/0/0)
Я также включил опцию поддержки активности на стороне сервера точно так же, как на стороне клиента. Теперь у меня есть несколько вопросов; 1- Когда я должен включить опцию поддержки активности? После подключения к серверу или перед подключением? 2- Должен ли я написать код для обнаружения ошибки поддержки активности в моей программе?
Кстати, моя программа работает в Linux Mint 17.1, и я также изменил параметры keeplalive в sysctl.conf и proc/sys на no vail.
Заранее спасибо за вашу помощь. Реза
netstat
указывает на то, что он работает. Непонятно, что вы спрашиваете. - person user207421   schedule 20.12.2016waitfor...()
(например,waitForReadyRead(milliseconds)
). Время ожидания может быть установлено на желаемое значение, и в течение этого времени также проверьте, активно ли соединение. Кстати, я новичок в Qt. Вы нашли решение вашей актуальной проблемы? @EJP, я думаю, что у OP есть проблема, когда розетка не отключается, даже когда интернет-штекер вытащен (если я правильно понял). - person iammilind   schedule 18.05.2017