//Конструктор QTcpServer Net_TcpServer::Net_TcpServer(){ if(!this->listen(QHostAddress::Any,TCPServPort)) { // обработка ошибок } connect(this,SIGNAL(newConnection()),this,SLOT(slotNewConnection())); qWarning("###################\nTCP SERVER STARTED!\n###################");}////////////////блок ответственный за новоподключившегосяvoid Net_TcpServer::slotNewConnection(){ QTcpSocket* pClientSocket = this->nextPendingConnection(); pClientSocket->setSocketOption(QAbstractSocket::KeepAliveOption,1);//я включаю механизм Keep alive connect(pClientSocket,SIGNAL(disconnected()),this,SLOT(dis()));//сообщение в qwarning("") об отключившимся connect(pClientSocket,SIGNAL(disconnected()),pClientSocket,SLOT(deleteLater()));//прибить сокет connect(pClientSocket,SIGNAL(readyRead()),this,SLOT(slotReadClient()));//чтение сообщения qWarning("Client "+pClientSocket->peerAddress().toString().toAscii()+" connected."); qWarning("Client connected. socket opt ->>"+pClientSocket->socketOption(QAbstractSocket::KeepAliveOption).toString().toLocal8Bit());//тут я проверяю включен ли keep alive}
//инициализация нити ответственной за сетьvoid Net::run(){... TCPSocket = new QTcpSocket(); connect(TCPSocket, SIGNAL(disconnected()),timerBr,SLOT(start())); connect(TCPSocket,SIGNAL(readyRead()),this,SLOT(TcpReadyRead())); connect(TCPSocket,SIGNAL(connected()),this,SLOT(TcpConnected())); connect(TCPSocket,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(TcpError(QAbstractSocket::SocketError)));... exec();//поддерживать нить "живой"...}//по достижению некоторого события (приходит udp от учителя с ip), просходит следующееvoid Net::TcpConToServ(){ TCPSocket->connectToHost(ServIP,TCPServPort);}//по сигналу подключенvoid Net::TcpConnected(){ TCPSocket->setSocketOption(QAbstractSocket::KeepAliveOption,1); qWarning("socket opt ->>"+TCPSocket->socketOption(QAbstractSocket::KeepAliveOption).toString().toLocal8Bit());//и это выводит мне ни "1", и не "0", а "-255"}
....#include <winsock2.h> // необходимые функции под виндой....//[1] данный кусок must be. инклюда с ним попросту не нашел 8(#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)struct tcp_keepalive {u_long onoff;u_long keepalivetime;u_long keepaliveinterval;};//{1}.......//[2] механизм обеспечения жизни TCP соединения.// этот кусок уже внутри функции connected. Выполняется только при уже установленном подключении. 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=150;// Если не пришел ответ выслать через 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); } //{2} механизм обеспечения жизни TCP соединения....
... qWarning("Client connected. socket opt ->>"+ pClientSocket->socketOption(QAbstractSocket::KeepAliveOption).toString().toLocal8Bit());...