2016-09-26 60 views
2

我在xUbuntu 14.04上使用Qt 4.8 GCC 32bit。
我有下面一段代碼,一個TCP服務器,我爲了得到一些遠程命令併發送回一些答案使用 - 可通過TCP套接字:Qt:使用QTcpSocket - >我可以在socket上寫,但我無法讀取...

struct _MyRequest 
{ 
    unsigned long Request; 
    unsigned long Data; 
} __attribute__((packed)); 

struct _MyAnswer 
{ 
    unsigned long Error; 
    unsigned long Filler; 
} __attribute__((packed)); 

_MyRequest request; 
_MyAnswer answer; 

RemoteCmdServer::RemoteCmdServer(QObject * parent) 
    : QTcpServer(parent) 
{ 
    qDebug() << "Server started"; 

    listen(QHostAddress("172.31.250.110"), 5004); 

    connect(this, SIGNAL(newConnection()), this, SLOT(processPendingRequest())); 
} 

void RemoteCmdServer::processPendingRequest() 
{ 
    qDebug() << "Process request"; 

    QTcpSocket * clientConnection = nextPendingConnection(); 
    connect(clientConnection, SIGNAL(disconnected()), clientConnection, SLOT(deleteLater())); 

    // get the request 
    int ret = clientConnection->read((char*)&request, sizeof(request)); 
    qDebug() << "READ: " << ret; 
    if(ret == sizeof(request)) 
    { 
     // send answer 
     clientConnection->write((char*)&answer, sizeof(answer)); 
    } 

    qDebug() << "Disconnecting..."; 
    clientConnection->disconnectFromHost(); 
} 

我能寫正確,如果我發表意見if(ret == sizeof(request))一行。
然而,我不能從套接字讀取(我總是得到0字節)。
我100%確定我用來發送數據包到我的應用程序的TCP工具工作正常。
這裏是我的應用程序輸出的調試:

Server started  
Process request  
READ: 0  
Disconnecting...  

我在做什麼錯?請指教!

+1

在嘗試讀取數據之前,您必須首先等待數據可用。請參閱[文檔](http://doc.qt.io/qt-5/qabstractsocket.html)。 – thuga

+0

我試了1000毫秒......它似乎沒有工作...... :( –

+0

你可以編輯你的問題,並顯示你如何嘗試?你確定數據在這1秒內發送? – thuga

回答

1

您應該以非阻塞或阻塞的方式等待數據。您可以使用waitForReadyRead以阻止方式執行此操作。

void RemoteCmdServer::processPendingRequest() 
{ 
    qDebug() << "Process request"; 

    QTcpSocket * clientConnection = nextPendingConnection(); 
    connect(clientConnection, SIGNAL(disconnected()), clientConnection, SLOT(deleteLater())); 

    if (clientConnection->waitForReadyRead()) 
    { 
     // get the request 
     QByteArray message = clientConnection->readAll(); // Read message 
     qDebug() << "Message:" << QString(message); 
    } 
    else 
    { 
     qDebug().nospace() << "ERROR: could not receive message (" << qPrintable(clientConnection->errorString()) << ")"; 
    } 

    qDebug() << "Disconnecting..."; 
    clientConnection->disconnectFromHost(); 
} 
+0

我嘗試使用'clientConnection-> waitForReadyRead(3000);'它根本不起作用。 - >閱讀:0 –

+0

我更新了我的示例代碼。嘗試使用readAll()讀取客戶端消息。 – talamaki

+0

它仍然不起作用... –

1

你試圖從新的連接讀取數據而不返回到Qt事件循環 - 我不認爲這會工作。

你已經接受了連接後...

QTcpSocket * clientConnection = nextPendingConnection(); 

您需要連接到其readyRead信號的東西,如...

connect(clientConnection, SIGNAL(readyRead()), this, SLOT(my_read_slot())); 

哪裏my_read_slot是成員函數將實際執行讀取操作。

相關問題