Проблема с QTcpSocket

Написание чата с помощью Qt. Есть проблема. QTcpSocket моего клиента остается в состоянии подключения, но сервер выдает сигнал newConnection(). Сетевой сеанс не требуется. Почему это? Вот код:

ChatClient::ChatClient(QObject *parent)
    : QObject(parent) {
    tcpSocket = new QTcpSocket(this);
    QNetworkConfigurationManager manager;
    if (QNetworkConfigurationManager::NetworkSessionRequired
        & manager.capabilities()) {
        qDebug() << "Network session required";
    }
    connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),
            this, SLOT(error(QAbstractSocket::SocketError)));
    connect(tcpSocket, SIGNAL(connected()),
            this, SLOT(requestForID()));
    connect(tcpSocket, SIGNAL(readyRead()),
            this, SLOT(receiveMessage()));
    tcpSocket->connectToHost("192.168.0.100", PORT);
}

void ChatClient::requestForID() {
    qDebug() << "Connected, requesting for ID";
    QByteArray segment;
    QDataStream out(&segment, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_7);
    out << (quint16)0 << ID;
    out.device()->seek(0);
    out << (quint16)(segment.size() - sizeof(quint16));
    tcpSocket->write(segment);
}

requestForID() никогда не выполняется

ChatServer::ChatServer(QObject *parent)
    : QObject(parent) {
    tcpServer = new QTcpServer(this);
    if (!tcpServer->listen(QHostAddress::Any, PORT)) {
        qDebug() << "Unable to start the server"
                 << tcpServer->errorString();
    }
    qDebug() << "Server port" << tcpServer->serverPort();
    connect(tcpServer, SIGNAL(newConnection()),
            this, SLOT(processConnection()));
}
void ChatServer::processConnection() {
    qDebug() << "Incoming connection";
    QTcpSocket *clientSocket = tcpServer->nextPendingConnection();
    /*connect(clientSocket, SIGNAL(readyRead()),
            this, SLOT(readData()));
    readData(clientSocket);
    connect(clientSocket, SIGNAL(disconnected()),
            clientSocket, SLOT(deleteLater()));*/
    QByteArray segment;
    QDataStream out(&segment, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_7);
    out << (quint16)0 << (quint16)Message
        << "Successfully connected";
    out.device()->seek(0);
    out << (quint16)(segment.size() - sizeof(quint16));
    clientSocket->write(segment);
    clientSocket->disconnectFromHost();
}

сервер отображает входящее соединение, а клиент не выдает соединение, оставаясь в состоянии соединения, а также не получает сообщение сервера... Есть идеи?


person OneMoreVladimir    schedule 26.05.2011    source источник


Ответы (1)


У меня была такая же проблема, и я нашел причину и решение.

connectToHost нельзя вызывать напрямую в конструкторе главного окна. Почему?

Причина в том, что в настоящее время основной цикл обработки сообщений еще не запущен. Внутренне QAbstractSocketPrivate::fetchConnectionParameters() никогда не вызывается, а Qt Socket Timeout Timer считает, что соединение никогда не установлено.

Решение состоит в том, чтобы назвать это «отложенным», как в

QMetaObject::invokeMethod(this, "OnDelayedConnect", Qt::QueuedConnection);

Или позвонить waitForConnected() после connectToHost

person bkausbk    schedule 09.01.2013