Of course. Full example in attachment.
Clilent code (with signal-slot processing in decryption problem)
void TestClient
::connectTo(const QString &host,
int port
) {
mSocket.connectToHostEncrypted(host, port);
mSocket.ignoreSslErrors();
if (!mSocket.waitForEncrypted(50000))
return ;
qDebug()<<"********** encrypted ************"<<mSocket.isEncrypted();
connect(&mSocket, SIGNAL(readyRead()), this, SLOT(readData()));
// readData();
}
void TestClient::readData()
{
qDebug()<<"*******************************************"<<mSocket.bytesAvailable();
while (mSocket.bytesAvailable()>0)
{
qint64 size=0;
qint64 offset=0;
int i;
mSocket.read((char*)&size, sizeof(size));
mSocket.read((char*)&i, sizeof(i));
if (mSocket.bytesAvailable()>=size)
{
qDebug()<<"*** Read all";
data=mSocket.read(size);
}
else
{
while (offset<size)
{
qDebug()<<"*** Read parts";
mSocket.waitForReadyRead(3000);
{
qDebug()<<"Connection close";
::exit(0);
}
tempData=mSocket.read(size-offset);
offset+=tempData.size();
data+=tempData;
}
}
qDebug()<<"packet"<<i<<"Read"<<offset<<"of"<<size<<"Bytes available"<<mSocket.bytesAvailable();
if (mSocket.bytesAvailable()>0)
{
qDebug()<<"We have some bytes"<<mSocket.bytesAvailable();
continue;
}
mSocket.waitForReadyRead(7000);
}
qDebug()<<"I hope no data. Exit from ReadData";
}
void TestClient::connectTo(const QString &host, int port)
{
mSocket.connectToHostEncrypted(host, port);
mSocket.ignoreSslErrors();
if (!mSocket.waitForEncrypted(50000))
return ;
qDebug()<<"********** encrypted ************"<<mSocket.isEncrypted();
connect(&mSocket, SIGNAL(readyRead()), this, SLOT(readData()));
// readData();
}
void TestClient::readData()
{
qDebug()<<"*******************************************"<<mSocket.bytesAvailable();
while (mSocket.bytesAvailable()>0)
{
qint64 size=0;
qint64 offset=0;
QByteArray data;
QByteArray tempData;
int i;
mSocket.read((char*)&size, sizeof(size));
mSocket.read((char*)&i, sizeof(i));
if (mSocket.bytesAvailable()>=size)
{
qDebug()<<"*** Read all";
data=mSocket.read(size);
}
else
{
while (offset<size)
{
qDebug()<<"*** Read parts";
mSocket.waitForReadyRead(3000);
if (mSocket.state()==QAbstractSocket::UnconnectedState)
{
qDebug()<<"Connection close";
::exit(0);
}
tempData=mSocket.read(size-offset);
offset+=tempData.size();
data+=tempData;
}
}
qDebug()<<"packet"<<i<<"Read"<<offset<<"of"<<size<<"Bytes available"<<mSocket.bytesAvailable();
if (mSocket.bytesAvailable()>0)
{
qDebug()<<"We have some bytes"<<mSocket.bytesAvailable();
continue;
}
mSocket.waitForReadyRead(7000);
}
qDebug()<<"I hope no data. Exit from ReadData";
}
To copy to clipboard, switch view to plain text mode
Server code
TestServer::TestServer()
{
}
void TestServer::init(int port)
{
mServerSocket=new TServer;
connect(mServerSocket, SIGNAL(newConnection(int)), this, SLOT(incomingConnection(int)));
mServerSocket->setMaxPendingConnections(10);
{
qDebug()<<tr("Port is busy");
::exit(0);
}
}
void TestServer::incomingConnection(int handle)
{
mSocket=new QSslSocket(this);
mSocket->setLocalCertificate("./server.crt");
mSocket->setPrivateKey("./server.pem");
mSocket->ignoreSslErrors();
connect(this, SIGNAL(connectionOK()), this, SLOT(mproc()), Qt::QueuedConnection);
if ( mSocket->setSocketDescriptor( handle ) )
{
mSocket->startServerEncryption();
if (!mSocket->waitForEncrypted())
{
qDebug()<<"Error ssl";
::exit(0);
}
}
else
::exit(0);
qDebug()<<"Is Server side encrypted"<<mSocket->isEncrypted();
emit connectionOK();
qDebug()<<"#################################";
}
void TestServer::mproc()
{
qDebug()<<"void TestServer::mproc()";
for (int i=0; i<5; i++)
{
// Simple test packet
qint64 size=0;
qint64 wrote=0;
// packet preparing
for (int a=0; a<900000; a++)
TestData
+=QUuid::createUuid().
toString();
size=TestData.toAscii().size();
mSocket->write((const char*)&size, sizeof(size));
mSocket->write((const char*)&i, sizeof(i));
wrote=mSocket->write(TestData.toAscii());
qDebug()<<"packet"<<i<<"wrote"<<wrote<<"bytes";
mSocket->flush();
// sleep(2);
}
}
TestServer::TestServer()
: QObject()
{
}
void TestServer::init(int port)
{
mServerSocket=new TServer;
connect(mServerSocket, SIGNAL(newConnection(int)), this, SLOT(incomingConnection(int)));
mServerSocket->setMaxPendingConnections(10);
if (!mServerSocket->listen(QHostAddress::Any, port))
{
qDebug()<<tr("Port is busy");
::exit(0);
}
}
void TestServer::incomingConnection(int handle)
{
mSocket=new QSslSocket(this);
mSocket->setLocalCertificate("./server.crt");
mSocket->setPrivateKey("./server.pem");
mSocket->ignoreSslErrors();
connect(this, SIGNAL(connectionOK()), this, SLOT(mproc()), Qt::QueuedConnection);
if ( mSocket->setSocketDescriptor( handle ) )
{
mSocket->startServerEncryption();
if (!mSocket->waitForEncrypted())
{
qDebug()<<"Error ssl";
::exit(0);
}
}
else
::exit(0);
qDebug()<<"Is Server side encrypted"<<mSocket->isEncrypted();
emit connectionOK();
qDebug()<<"#################################";
}
void TestServer::mproc()
{
qDebug()<<"void TestServer::mproc()";
for (int i=0; i<5; i++)
{
// Simple test packet
QString TestData;
qint64 size=0;
qint64 wrote=0;
// packet preparing
for (int a=0; a<900000; a++)
TestData+=QUuid::createUuid().toString();
size=TestData.toAscii().size();
mSocket->write((const char*)&size, sizeof(size));
mSocket->write((const char*)&i, sizeof(i));
wrote=mSocket->write(TestData.toAscii());
qDebug()<<"packet"<<i<<"wrote"<<wrote<<"bytes";
mSocket->flush();
// sleep(2);
}
}
To copy to clipboard, switch view to plain text mode
Where I am wrong? Please correct me. Where is the trick?
Now I have no ideas how to use QSslSocket in Signal-Slot Gui application.
Bookmarks