Коллеги, помогите! Уже три дня не пойму что не так.
Делаю клиент-сервер на основе потоков. Нужен блокирующий режим.
Вот код потока на клиенте:
ClientThread::ClientThread(QObject *parent) : QThread(parent)
{
socket=new QSslSocket(this);
QObject::connect(socket, SIGNAL(encrypted()), this, SLOT(socketReady()));
QObject::connect(socket, SIGNAL(sslErrors(const QList<QSslError> &)), this, SLOT(socketSslErrors(const QList<QSslError> &)));
QObject::connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(socketError(QAbstractSocket::SocketError)));
}
void ClientThread::run()
{
if(socket)
{
while(socket->state()==QAbstractSocket::ConnectedState) //пока соединены
{
if(socket->waitForReadyRead(30000)) //блокирующий режим- ждём данных
{
//данные пришли
if(socket->bytesAvailable()!=0)
{
qDebug(socket->readAll().data());
}
}
}
//поток закрывается
}
}
void ClientThread::connect(QString host, int port)
{
socket->connectToHostEncrypted(host, port);
}
void ClientThread::socketReady()
{
this->start();
socket->write("Hello, Server!");
}
void ClientThread::socketSslErrors(const QList<QSslError> &errors)
{
qDebug("SSL error");
socket->ignoreSslErrors();
}
void ClientThread::socketError(QAbstractSocket::SocketError socketError)
{
qDebug("Socket error");
qDebug(QVariant(socketError).toString().toAscii());
qDebug(socket->errorString().toAscii());
}
А вот на сервере(тоже называется ClientThread):
ClientThread::ClientThread(int socketDescriptor, QObject *parent) : QThread(parent)
{
socket=new QSslSocket(this);
if(socket->setSocketDescriptor(socketDescriptor))
{
socket->setLocalCertificate("./rsa/server.pem");
socket->setPrivateKey("./rsa/server.key");
QObject::connect(socket, SIGNAL(encrypted()), this, SLOT(socketReady()));
QObject::connect(socket, SIGNAL(sslErrors(const QList<QSslError> &)), this, SLOT(socketSslErrors(const QList<QSslError> &)));
QObject::connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(socketError(QAbstractSocket::SocketError)));
socket->startServerEncryption();
}
else
{
delete socket;
}
}
void ClientThread::run()
{
if(socket)
{
while(socket->state()==QAbstractSocket::ConnectedState) //пока соединены
{
if(socket->waitForReadyRead(30000)) //блокирующий режим- ждём данных
{
//данные пришли
if(socket->bytesAvailable()!=0)
{
qDebug(socket->readAll().data());
socket->write("Hello, Client!");
}
}
}
//поток закрывается
}
}
void ClientThread::socketReady()
{
this->start();
}
void ClientThread::socketSslErrors(const QList<QSslError> &errors)
{
qDebug("SSL error");
socket->ignoreSslErrors();
}
void ClientThread::socketError(QAbstractSocket::SocketError socketError)
{
qDebug("Socket error");
qDebug(QVariant(socketError).toString().toAscii());
qDebug(socket->errorString().toAscii());
}
Так вот, программы ведут себя неадекватно при соединении... encrypted() вызывается, а после этого клиент может доставить "Hello, Server" и выпасть в SocketError -1, либо не доставить и сервер выпадет... либо вообще ничего не покажут...
Если в run() вызывать просто exec() и обрабатывать readyRead() сокета- то данные гуляют нормально... Следовательно глюк где-то в потоках... где никак не пойму... может кто увидит ошибку?