QTcpSocket не излучает сигнал

0

Я написал небольшой сервер для tcp в qt и перешел ко второму потоку (проще для меня обращаться). Код для сервера:

#include "server.h"


Server::Server(QString ipAddr, quint32 port)
{
    Server::ipAddr = ipAddr;
    Server::port = port;
    firstTime = true;
    sessionOpened();
    qDebug() << "New server created (from Server)!";

    //connect(Server::tcpServer, SIGNAL(newConnection()), this, SLOT(createConnection()));
    qDebug() << "Connections created!";

}

void Server::showSignals()
{
    exit(0);
    qCritical() << m_pSignalSpy->wait(10000);
//    for(int index = 0; index<m_pSignalSpy->size(); index++)
//    {
//        QList<QVariant> listItem = m_pSignalSpy->value(index);

//        qDebug() << "Signal Arguments: ";
//        for(int index2 = 0;index2 < listItem.size();index2++)
//        {
//            qDebug() << listItem[index2].toString().toStdString()<<" ";
//        }
//    }
}

void Server::sessionOpened()
{
    Server::tcpServer = new QTcpServer(this);
    connect(tcpServer, &QTcpServer::newConnection, this, &Server:: gotAConnection);
    if(!Server::tcpServer->listen(QHostAddress::Any, (quint16)Server::port))
    {
        //QMessageBox::information(this, tr("Server"), tr("Unable to start the server: %1.").arg(Server::tcpServer->errorString()));
        Server::tcpServer->close();
        exit(0);
        return;
    }

    QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses();
    // use the first non-localhost IPv4 address
    for (int i = 0; i < ipAddressesList.size(); ++i) {
        if (ipAddressesList.at(i) != QHostAddress::LocalHost &&
                ipAddressesList.at(i).toIPv4Address()) {
            Server::ipAddr = ipAddressesList.at(i).toString();
            break;
        }
    }
    // if we did not find one, use IPv4 localhost
    if (Server::ipAddr.isEmpty())
        Server::ipAddr = QHostAddress(QHostAddress::LocalHost).toString();

    qDebug() << Server::ipAddr;
    qDebug() << Server::tcpServer->hasPendingConnections();
//    connect(Server::tcpServer, SIGNAL(newConnection()), this, SLOT(gotAConnection()));
//    Server::m_pSignalSpy = new QSignalSpy(Server::tcpServer, SIGNAL(newConnection()));
//    connect(Server::tcpServer, SIGNAL(newConnection()), this, SLOT(showSignals()));
}

void Server::getInfo()
{
    sendData("Hello");
}

void Server::destroyConnection()
{
    Server::clientConnection->disconnectFromHost();
}

void Server::gotAConnection()
{
    qDebug() << "Got new Connection!";
    exit(0);
}

void Server::createConnection()
{
    qDebug() << "Got new connection, more info later!";
    Server::clientConnection = tcpServer->nextPendingConnection();
    qDebug() << "Got new connection from " << Server::clientConnection->peerAddress().toString();
    emit Server::gotNewConnection(Server::clientConnection->peerAddress().toString());
}

void Server::sendData(QVariant data)
{
    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_0);
    out << (quint16)0;
    out << data;// << '\n' << data.type();
    qCritical() << "Sending Data!";
    out.device()->seek(0);
    out << (quint16)(block.size() - sizeof(quint16));
    connect(clientConnection, SIGNAL(disconnected()), clientConnection, SLOT(deleteLater()));
    clientConnection->write(block);
}

void Server::closeServer()
{
    destroyConnection();
    return;
}

server.h:

#ifndef SERVER_H
#define SERVER_H
#include <QTcpServer>
//#include <QtTest/QTest>
#include <QSignalSpy>
#include <QTcpSocket>
#include <QDebug>
//#include <QMessageBox>
#include <QNetworkInterface>
#include <typeinfo>
//#include <QSignalSpy>

class Server : public QObject
{
    Q_OBJECT
public slots:
    void sessionOpened();


    void getInfo();
    void closeServer();
    void createConnection();
    void gotAConnection(void);
    void destroyConnection();
    void sendData(QVariant data);
    void showSignals(void);
signals:
    void gotNewConnection(QString);
private:
    QTcpServer *tcpServer;
    QString ipAddr;
    quint32 port;
    QTcpSocket *clientConnection;
    quint32 BlockSize;
    bool firstTime;
    QSignalSpy * m_pSignalSpy;
//    template <typename t>
//    void getD
public:
    Server(QString ipAddr, quint32 port);
};

#endif // SERVER_H

Я могу запустить сервер, и я подключаюсь к нему (например, через Telnet), но tcpServer не генерирует сигнал, если что-то связано с ним. Зачем? Я сделал что-то не так?
EDIT: обновленный код добавлен

  • 0
    Вы наследуетесь от QTcpServer (класс Server: public QTcpServer), а также имеете экземпляр QTcpServer (QTcpServer * tcpServer). У вас есть веская причина для этого? Лично я бы унаследовал от QObject и содержал бы экземпляр QTcpServer
  • 0
    Не было никакой причины для этого, исправлено, но проблема все еще сохраняется ...
Показать ещё 2 комментария
Теги:
qt
tcp

1 ответ

0
connect(Server::tcpServer, SIGNAL(newConnection()), this, SLOT(gotAConnection()));

Я считаю, что это проблема, и соединение здесь не работает.

Чтобы подключиться, первым параметром должен быть адрес экземпляра объекта, полученного из QObject. Член tcpServer не был создан, вы должны подключиться к экземпляру и вызвать его после создания объекта QTcpServer.

Удалите соединение в конструкторе и добавьте его в функцию SessionOpened после создания экземпляра QTcpServer.

Если вы используете С++ 11, вы также можете использовать новый синтаксис соединения, который будет предупреждать вас во время компиляции, если есть проблема.

Server::tcpServer = new QTcpServer(this);
connect(tcpServer, &QTcpServer::newConnection, this, &Server:: gotAConnection);
  • 0
    К сожалению, я до сих пор ничего не получаю в своем журнале (qDebug () << «Получил соединение» переходит в файл журнала). Добавление нового кода в вопрос.
  • 0
    Если соединение действительно, то может случиться так, что поток, в котором пишет qDebug, не очищается до того, как вы выйдете из программы, сразу после этого вызова. Поставьте точку останова на qDebug; это попало?
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню