2017-01-02 3 views
0

Я хочу использовать некоторые стандартные методы QUdpSocket, если быть точным read() и readAll(). Так, в соответствии с документацией QUdpSocket:Использование QUdpSocket как QIODevice

Если вы хотите использовать стандартные функции QIODeviceread(), readLine(), write() и т.д., вы должны сначала соединить разъем непосредственно к партнеру по телефону connectToHost().

Я называю connectToHost() непосредственно после bind():

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

Теперь он может читать, но он не излучает readyRead() сигнал. Каков правильный способ использования QIODevice функции QUdpSocket?

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 лязг x64. ОС: macOS Sierra 10.12.2.

ответ

1

С моей точки зрения это неправильно использовать BIND и connectToHost вместе.

связывают метод должен быть использован в случаях сервер UDP и connectToHost метод должен быть использован только для клиента UDP. Так что просто пробуйте опустить connectToHost звонок, и вы получите входящие датаграммы на 14560 порт.

связывают описание метода в Qt документации:

Для UDP сокетов, после связывания, то сигнал QUdpSocket :: readyRead() испускается всякий раз, когда дейтаграмма UDP поступает на заданный адрес и порт. Таким образом, эта функция полезна для написания UDP-серверов.

+0

Да, это работает, но в этом случае я должен использовать 'readDatagram()' и 'writeDatagram()' вместо методов read() 'и' write() '. И я хочу использовать тот же метод 'onDataReceived()' для получения от любых 'QIODevie' (' QTcpSocket', 'QSerialPort' и т. Д.). –

+0

Итак, можно ли одновременно использовать методы 'read()', 'write()' и 'readyRead()'? –

+1

Камиль, похоже что QIODevice интерфейс можно использовать только для udp-клиента :-(Какой-то эпический сбой у qt'шников. – Andrey