2017-01-02 56 views
0

我想用一些標準的QUdpSocket方法精確地爲read()readAll()。因此,根據QUdpSocket文件:使用QUdpSocket作爲QIODevice

如果你想使用標準QIODevice功能read()readLine()write(),等等,你必須首先通過直接調用connectToHost()連接插座同行。

我叫connectToHost()bind()後直接:

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

現在可以讀,但它並沒有發出readyRead()信號。使用QUdpSocketQIODevice函數的正確方法是什麼?

DeviceReader.h:

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:

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鐺64。操作系統:macOS Sierra 10.12.2。

回答

1

從我的角度來看,這是不正確的使用綁定connectToHost在一起。

綁定方法在UDP服務器的情況下使用和connectToHost方法具有用於僅UDP客戶端。因此,只需嘗試省略connectToHost調用,您將收到14560端口上的傳入數據報。 Qt中文檔

bind方法描述:

對於UDP套接字,在結合後,信號QUdpSocket提供:: readyRead()被每當UDP數據報到達所指定的地址和端口射出。因此,這個函數對編寫UDP服務器很有用。

+0

是的,但在這種情況下,我必須使用'readDatagram()'和'writeDatagram()',而不是'read()'和'write()'方法。我想用同樣的方法'onDataReceived()'從任何'QIODevie'('QTcpSocket','QSerialPort'等)接收。 –

+0

那麼,是否可以同時使用'read()','write()'方法和'readyRead()'信號? –

+1

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