2012-03-29 28 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应该可以帮助你理解概念。