QTcpServer不能正常工作

问题描述:

我想用QT在C++中创建一个TCP服务器。我有代码,但只要我尝试使用SocketTest连接到服务器,它说连接被拒绝(很可能是由于服务器没有运行)。QTcpServer不能正常工作

这是我tcplistener.h:

#ifndef TCPLISTENER_H 
#define TCPLISTENER_H 

#include <QtNetwork/QTcpSocket> 
#include <QtNetwork/QTcpServer> 

class tcp_listener : public QTcpServer 
{ 
    Q_OBJECT 
signals: 
public slots: 
    void newConnectionFromServer() 
    { 
     QTcpSocket* newConnection = nextPendingConnection(); 
     qDebug("New connection from %d", newConnection->peerAddress().toIPv4Address()); 
    } 
public: 
    tcp_listener(QObject *parent = 0) 
     : QTcpServer(parent) 
    { 
     listen(QHostAddress::Any, 30000); 
     connect(this, SIGNAL(newConnection()), SLOT(newConnectionFromServer())); 
    } 
}; 

#endif // TCPLISTENER_H 

这是我engine.h:

#ifndef ENGINE_H 
#define ENGINE_H 

#include <QCoreApplication> 

#include "tcplistener.h" 

class engine 
{ 
public: 
    void init() 
    { 
     qDebug("Initializing AuraEmu..."); 

     tcp_listener list(); 
    } 
}; 

#endif // ENGINE_H 

,这是我的main.cpp:

#include <QCoreApplication> 

#include "engine.h" 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    engine eng = engine(); 
    eng.init(); 

    return a.exec(); 
} 

任何人知道问题是什么?

+0

什么是那些两行代码的情况下?你的物体是否立即超出范围?我注意到你在栈上而不是在堆上创建它,所以只要你离开块,它就会被销毁,除非你有一个嵌套的事件循环。 – sashoalm

+0

我的问题包含所有代码。我称之为在我的入口点调用这两行的函数。我不是100%习惯于C++,所以事情可能与C#和Java等语言不同。 –

+0

我怀疑你对非托管语言没有太多经验,这对C++来说是一个**真正的问题**。你真的需要对堆栈和堆之间的区别有一个很好的理解。你知道,正如“如果一切都失败了,请阅读手册”。 – sashoalm

另一个答案和我之前的评论已经涵盖了你做错了什么,所以我只是提供解决方案。

我已经添加了评论,因为你说你来自Java和C#,但确实,不要试图编程C++,因为它是Java或C#,因为它不是。

class engine 
{ 
public: 
    void init() 
    { 
     qDebug("Initializing AuraEmu..."); 
     tcp_listener *list = new tcp_listener(); // Allocate on the heap instead of the stack. 
    } 

    ~engine() 
    { 
     delete list; // C++ is an UNMANAGED language, there is no garbage collector 
    } 
private: 
    tcp_listener *list; // This is a pointer to an object. 
}; 
+0

谢谢,这工作!我会去学习一些关于堆栈和堆的东西,我已经在学校里得到了它,但它有点让我失望。 –

eng.init(); 

这里创建

tcp_listener list(); 

和eng.init后()完成后,您detroy,因为 它是在栈对象。

+0

我尝试把它作为一个变量在类本身,但然后我得到以下错误: /usr/include/qt4/QtNetwork/qtcpserver.h:102:错误:'QTcpServer :: QTcpServer(const QTcpServer&)'是私人 Q_DISABLE_COPY(QTcpServer) ^ –