2012-03-29 21 views
2

私は、LinuxでブロードキャストされたUDPデータグラムを読むプログラムを書こうとしています。私はソケットプログラミングの初心者です。QTでC++ソケットプログラミングベースのUDPを書くには?

#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

+0

@hamed:はい、それは私のために働いた。私はLinux上でコードをテストした(netcatを送信者として)。 – alexisdm

+1

しかし、質問に "放送"を追加したので、私はそれに応じて私の答えを編集しました。 – alexisdm

0

あなたのメイン機能からシグナルスロットを使用することはできません。ソケットを作成しreadyRead信号をクラスのスロットに接続するQObjectから派生した新しいクラスを作成する必要があります。

This exampleは、概念を理解するのに役立ちます。