Я пишу AsyncSocket
, который использует QTcpSocket
для работы с некоторыми серверами. Они (серверы) были написаны давно и у меня нет возможности их менять.
Итак, проблема в отсутствии сигнала readyRead
, если сервер не может распознать сообщение (потому что он ничего не сделал с типом сообщения default
). Я думаю, что это проблема сервера, потому что он все равно должен отвечать ... но это не мой собственный код, и я должен использовать его как есть.
Я думал использовать QAbstractSocket::waitForReadyRead(int msecs)
, но нашел в Документация Qt (конец раздела 'детали'):
Примечание : мы не рекомендуем использовать функции блокировки вместе с
сигналы. Следует использовать одну из двух возможностей.
Итак, я немного запутался, почему мне не следует использовать такой метод блокировки:
void AsyncSocket::send(const QByteArray &msg)
{
socket->write(msg);
if (!socket->waitForReadyRead(msecs))
qDebug() << "Warning! ReadyRead were not emitted";
}
Сервер работает так:
switch(received_msg.type)
{
case TYPE_ONE: // do smth
break;
case TYPE_TWO: // do smth
break;
case TYPE_N: // do smth
break;
default:
// do NOTHING
}
Мой класс:
class AsyncSocket
{
public:
void connectToHost(const QString &host, qint16 port);
void send(const QByteArray &msg);
void disconnectFromHost();
// other public members
public slots:
void connected();
void readyRead();
};
ОБНОВЛЕНИЕ : Может быть полезно отловить пропущенные readyRead
сигналы для организации очереди сообщений с использованием AsyncSocket