2012-03-29 53 views
2

我正試圖編寫一個程序,讀取在linux中廣播的UDP數據報。我是套接字編程的初學者。
我的代碼是:如何使用QT編寫基於UDP的C++套接字編程?

#include <QUdpSocket> 
#include <iostream> 


int main() 
{ 
    QUdpSocket *udpSocket ; 
    udpSocket= new QUdpSocket(0); 
    udpSocket->bind(QHostAddress::LocalHost, 3838); 


    udpSocket->connect(udpSocket, SIGNAL(readyRead()), 
      this, SLOT(readPendingDatagrams())); 

    while (1) 
    { 
     if (udpSocket->hasPendingDatagrams()) 
     { 
      QByteArray datagram; 
      datagram.resize(udpSocket->pendingDatagramSize()); 
      QHostAddress sender; 
      quint16 senderPort; 

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

但在this返回錯誤。

main.cpp:13:18: error: invalid use of ‘this’ in non-member function

我該怎麼辦?

回答

2

您需要一個事件循環中使用的信號和槽(具有QCoreApplicationQApplication,或QEventLoop)和QObject派生類來承載槽。

但您可以同步使用套接字沒有信號/槽或一個事件循環,通過使用功能QUdpSocket::waitForReadyReadwaitForBytesWritten ...:

#include <QUdpSocket> 
#include <QTextStream> 

int main() 
{ 
    QTextStream qout(stdout); 

    QUdpSocket *udpSocket = new QUdpSocket(0); 
    udpSocket->bind(3838, QUdpSocket::ShareAddress); 

    while (udpSocket->waitForReadyRead(-1)) { 
     while(udpSocket->hasPendingDatagrams()) { 
      QByteArray datagram; 
      datagram.resize(udpSocket->pendingDatagramSize()); 
      QHostAddress sender; 
      quint16 senderPort; 

      udpSocket->readDatagram(datagram.data(), datagram.size(), 
            &sender, &senderPort); 
      qout << "datagram received from " << sender.toString() << endl; 
     } 
    } 
} 

編輯:要收聽廣播的UDP數據報,你也不應該聽取QHostAddress::LocalHost,而應該聽取QHostAddress::Any(或者至少是連接到外部接口的IP地址)。

+0

沒有'connect'就無法工作。它爲你工作? – hamed 2012-03-29 13:33:23

+0

@hamed:是的,它爲我工作。我測試了Linux上的代碼(以netcat作爲發件人)。 – alexisdm 2012-03-29 14:01:55

+1

但是既然你在你的問題中加了「廣播」,我就相應地編輯了我的答案。 – alexisdm 2012-03-29 14:09:41

0

您不能在主要功能中使用信號插槽。您需要創建從QObject派生的新類,以創建套接字並將readyRead信號連接到您的類的插槽。

This example應該可以幫助你理解概念。