2017-01-02 11 views
0

標準のQUdpSocketメソッドを正確に使用する場合、read()readAll()です。だから、QUdpSocketのマニュアルに従って:あなたは標準QIODevice機能read()readLine()write()などを使用したい場合はQIODeviceとしてQUdpSocketを使用する

、最初connectToHost()を呼び出すことにより、ピアに直接ソケットを接続する必要があります。

私はbind()後に直接connectToHost()を呼び出す:

socket.bind(QHostAddress::LocalHost, 14560); 
socket.connectToHost(QHostAddress::LocalHost, 14560); 

今では読むことができますが、それはreadyRead()信号を発することはありません。 QIODeviceの機能を使用する適切な方法は何ですかQUdpSocket

class DeviceReader : public QObject { 
     Q_OBJECT 
    public: 
     DeviceReader() {} 

     void setDevice(QIODevice * device) { 
      _device = device; 
      connect(device, &QIODevice::readyRead, this, &DeviceReader::onDataReceived); 
     } 

     void onDataReceived() { 
      qDebug() << "received: " << _device->readAll(); 
     } 
    private: 
     QIODevice * _device; 
}; 

main.cpp:

DeviceReader.h:

int main(int argc, char *argv[]) { 
    QCoreApplication a(argc, argv); 

    DeviceReader reader; 
    QUdpSocket socket; 

    socket.bind(QHostAddress::LocalHost, 14560); 
    socket.connectToHost(QHostAddress::LocalHost, 14560);  
    reader.setDevice(&socket); 

    return a.exec(); 
} 

Qtのバージョンは5.7.0打ち鳴らすx64のです。 OS:macOS Sierra 10.12.2。

答えて

1

私の視点から、一緒にバインドconnectToHostを使用することが間違っています。

バインド方法は、UDPサーバの例で使用する必要があるとconnectToHost方法は、UDPクライアントにのみ使用する必要があります。だからちょうどを省略しようとするとconnectToHostコールとあなたは14560ポートで受信データグラムを受信します。

Qtのドキュメントに結合する方法の説明:UDPデータグラムを指定されたアドレスとポートに到着するたびにUDPソケットについて

、結合した後、信号QUdpSocket :: readyRead()が放出されます。したがって、この機能はUDPサーバを書くのに便利です。

+0

はい、動作しますが、この場合は 'read()'と 'write()'メソッドの代わりに 'readDatagram()'と 'writeDatagram()'を使用しなければなりません。そして、私は 'QIODevie'(' QTcpSocket'、 'QSerialPort'など)から受け取るために同じメソッド' onDataReceived() 'を使用したいと思います。 –

+0

'read()'、 'write()'メソッドと 'readyRead()'シグナルを同時に使うことは可能ですか? –

+1

Камиль、похожечтоのQIODeviceинтерфейсможноиспользоватьтолькодляUDP-клиентаКакой-то叙事詩:-(はуqt'шниковに失敗。 – Andrey

関連する問題