2014-11-17 4 views
0

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

#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 (класс сервера: общественный QTcpServer), а также имеющие экземпляр QTcpServer (QTcpServer * TCPServer). У вас есть веская причина для этого? Лично я бы наследовал от QObject и держал экземпляр QTcpServer – TheDarkKnight

+0

Не было причин для этого, исправлено, но проблема все еще сохраняется ... –

+0

Пожалуйста, обновите код в вопросе, чтобы представить исправление. – TheDarkKnight

ответ

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

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

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

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

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

Server::tcpServer = new QTcpServer(this); 
connect(tcpServer, &QTcpServer::newConnection, this, &Server:: gotAConnection); 
+0

К сожалению, я до сих пор ничего не получил в своем журнале (qDebug() << "Получил соединение" переходит в файл журнала). Добавление нового кода в вопрос. –

+0

Если соединение действительно, возможно, поток, в котором записывается qDebug, не очищается, прежде чем вы покинете программу сразу после этого вызова. Поместите точку останова на qDebug; он попадает? – TheDarkKnight

+0

Программа никогда не уходит, и точка останова никогда не попадает. Как проверить правильность соединения? –

Смежные вопросы