2011-07-04 174 views
2

我正在嘗試編寫一個小的UDP服務器應用程序。Qt QUdpSocket readyRead()信號未觸發

我有一個客戶端傳輸到這個應用程序的套接字,我已經驗證這是使用一個小的UDP回聲程序(它將端口上收到的數據回顯到屏幕)發送正常,而且我可以看到收到的數據包Wireshark的。

我正在使用QUdpSocket,它會出現這樣的綁定設置確定 - 但readyRead()信號似乎並沒有被觸發。

我已經在下面列出了一些我的代碼 - 當時我只是試圖模擬小回聲程序。

只是爲了給下面的代碼提供一些上下文 - 在UI上按下按鈕在UI上鍵入的端口上調用「setupNewSocket」。

#include "sockethandler.h" 

SocketHandler::SocketHandler(QObject *parent) : 
QObject(parent) 
{ 
    udpSocket = new QUdpSocket(this); 

    connect(&w, SIGNAL(openNewUDPSocket(quint16)), this, SLOT(setupNewSocket(quint16))); 
    connect(this, SIGNAL(printOnUI(QString,QString,QString)), &w, SLOT(updateUI(QString,QString,QString))); 

    w.show(); 
} 

void SocketHandler::readPendingDatagrams() 
{ 
    while (udpSocket->hasPendingDatagrams()) 
    { 
     QByteArray datagram; 
     datagram.resize(udpSocket->pendingDatagramSize()); 
     QHostAddress sender; 
     quint16 senderPort; 

     udpSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort); 

     QString data = QString(datagram.data()); 
     QString sender_address = sender.toString(); 
     QString sender_port = QString("%1").arg(senderPort); 

     emit printOnUI(data, sender_address, sender_port); 

    } 

} 
void SocketHandler::setupNewSocket(quint16 port) 
{ 
    if(udpSocket->bind(QHostAddress::LocalHost, port)) 
    { 
    connect(udpSocket, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams())); 
    } 
    else 
    { 
    // bind has failed 
    } 

} 

回答

3

QHostAddress::LocalHost綁定到127.0.0.1。

也許你需要使用QHostAddress ::任何它綁定到0.0.0.0。

+0

謝謝 - 我已經意識到這大約7分鐘前,但因爲我只有50個信用,它不會讓我回答自己的問題,直到8小時過去。我向你致敬! – Matt