我想使用一些标准的QUdpSocket
方法来准确read()
和readAll()
。因此,根据QUdpSocket
的文档:
如果您要使用标准
QIODevice
函数read()
,readLine()
,write()
等,则必须首先通过调用{将套接字直接连接到对等方{1}}。
我在connectToHost()
之后直接致电connectToHost()
:
bind()
现在它可以读取,但它不会发出socket.bind(QHostAddress::LocalHost, 14560);
socket.connectToHost(QHostAddress::LocalHost, 14560);
信号。使用readyRead()
的{{1}}函数的正确方法是什么?
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;
};
Qt版本是5.7.0 clang x64。操作系统:macOS Sierra 10.12.2。
答案 0 :(得分:1)
从我的角度来看,将 bind 和 connectToHost 结合使用是不正确的。
在UDP服务器的情况下必须使用绑定 方法,并且 connectToHost 方法必须用于仅限UDP客户端。因此,只需尝试省略 connectToHost 调用,您将在14560端口上接收传入的数据报。
在Qt docs中绑定方法描述:
对于UDP套接字,绑定后,只要UDP数据报到达指定的地址和端口,就会发出信号QUdpSocket :: readyRead()。因此,此函数对于编写UDP服务器很有用。