Hello,
I need to use a QTcpSocket for a 3D application (client side). My app has his own event loop, and I can't use signals and slots as the normal way (An QCoreApplication is not created). So I am trying to find an alternativ way.
I made a test application, and remarked that functions waitForXxx of the socket classes can't being used in my case, because I've to block my 3D application for waiting for events, and I can't permit that in my render loop :/
So I'm trying to understand how the eventsLoops of Qt are capturing signals for doing a similar thing in my event loop but it's pretty complicated ^^ (function QEventLoop:
rocessEvents)
What I want exactly :
Adding a refresh function for verifying connection, disconnection, readyRead or readyWrite states of the socket.
State function returns a resfreshed state of the socket.
Someone can give me somes ideas for realising that ?
thanks.
here the code of my test application (we have to type "enter" to connect or disconnect):
#include <QtCore>
#include <QtNetwork>
#include <windows.h>
#include <iostream>
{
if ( socket != NULL )
{
{
socket->connectToHost("localhost", 1337);
}
{
socket->disconnectFromHost();
}
else
{
socket->abort();
}
}
}
int main(int argc, char *argv[])
{
int stateEnter;
while (1)
{
int lastStateEnter = stateEnter;
stateEnter = GetKeyState(VK_RETURN);
if ( lastStateEnter != stateEnter && GetKeyState(VK_RETURN) < 0 )
{
connectOrDisconnect( socket );
}
if ( socket
->state
() == QAbstractSocket::UnconnectedState && socket
->waitForConnected
(100) ) std::cout << "disconnected" << std::endl;
if ( socket
->state
() == QAbstractSocket::ConnectedState && socket
->waitForDisconnected
(100) ) std::cout << "disconnected" << std::endl;
if ( socket->waitForReadyRead(100) )
std::cout << "ReadyRead" << std::endl;
if ( socket->bytesAvailable() )
std
::cout <<
QString::number(socket
->bytesAvailable
()).
toStdString() <<
" bytes available" << std
::endl;
switch ( socket->state() )
{
std::cout << "UnconnectedState" << std::endl;
break;
std::cout << "HostLookupState" << std::endl;
break;
std::cout << "ConnectingState" << std::endl;
break;
std::cout << "ConnectedState" << std::endl;
break;
std::cout << "BoundState" << std::endl;
break;
std::cout << "ClosingState" << std::endl;
break;
std::cout << "ListeningState" << std::endl;
break;
default:
std::cout << "Unknow" << std::endl;
break;
}
}
}
#include <QtCore>
#include <QtNetwork>
#include <windows.h>
#include <iostream>
void connectOrDisconnect(QTcpSocket * socket)
{
if ( socket != NULL )
{
if ( socket->state() == QAbstractSocket::UnconnectedState )
{
socket->connectToHost("localhost", 1337);
}
else if ( socket->state() == QAbstractSocket::ConnectedState )
{
socket->disconnectFromHost();
}
else
{
socket->abort();
}
}
}
int main(int argc, char *argv[])
{
QTcpSocket * socket = new QTcpSocket;
int stateEnter;
while (1)
{
int lastStateEnter = stateEnter;
stateEnter = GetKeyState(VK_RETURN);
if ( lastStateEnter != stateEnter && GetKeyState(VK_RETURN) < 0 )
{
connectOrDisconnect( socket );
}
if ( socket->state() == QAbstractSocket::UnconnectedState && socket->waitForConnected(100) )
std::cout << "disconnected" << std::endl;
if ( socket->state() == QAbstractSocket::ConnectedState && socket->waitForDisconnected(100) )
std::cout << "disconnected" << std::endl;
if ( socket->waitForReadyRead(100) )
std::cout << "ReadyRead" << std::endl;
if ( socket->bytesAvailable() )
std::cout << QString::number(socket->bytesAvailable()).toStdString() << " bytes available" << std::endl;
switch ( socket->state() )
{
case QAbstractSocket::UnconnectedState:
std::cout << "UnconnectedState" << std::endl;
break;
case QAbstractSocket::HostLookupState:
std::cout << "HostLookupState" << std::endl;
break;
case QAbstractSocket::ConnectingState:
std::cout << "ConnectingState" << std::endl;
break;
case QAbstractSocket::ConnectedState:
std::cout << "ConnectedState" << std::endl;
break;
case QAbstractSocket::BoundState:
std::cout << "BoundState" << std::endl;
break;
case QAbstractSocket::ClosingState:
std::cout << "ClosingState" << std::endl;
break;
case QAbstractSocket::ListeningState:
std::cout << "ListeningState" << std::endl;
break;
default:
std::cout << "Unknow" << std::endl;
break;
}
}
}
To copy to clipboard, switch view to plain text mode
If found this code in QAbstractSocket::waitForConnected :
if (d->socketEngine && d->socketEngine->waitForWrite(timeout, &timedOut) && !timedOut) {
d->_q_testConnection();
} else {
d->_q_connectToNextAddress();
}
if (d->socketEngine && d->socketEngine->waitForWrite(timeout, &timedOut) && !timedOut) {
d->_q_testConnection();
} else {
d->_q_connectToNextAddress();
}
To copy to clipboard, switch view to plain text mode
but I don't know what is d ? and socketEngine (maybe the platforme dependant socket object) ?
Bookmarks