2017-01-02 106 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