2015-09-05 333 views
0

我想用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

回答

1

另一個答案和我之前的評論已經涵蓋了你做錯了什麼,所以我只是提供解決方案。

我已經添加了評論,因爲你說你來自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

謝謝,這工作!我會去學習一些關於堆棧和堆的東西,我已經在學校裏得到了它,但它有點讓我失望。 –

1
eng.init(); 

這裏創建

tcp_listener list(); 

和eng.init後()完成後,您detroy,因爲 它是在棧對象。

+0

我嘗試把它作爲一個變量在類本身,但然後我得到以下錯誤: /usr/include/qt4/QtNetwork/qtcpserver.h:102:錯誤:'QTcpServer :: QTcpServer(const QTcpServer&)'是私人 Q_DISABLE_COPY(QTcpServer) ^ –