我想使用一些标准的QUdpSocket方法,精确地说是read()和readAll()。因此,根据QUdpSocket的文档
如果要使用标准的
QIODevice函数read()、readLine()、write()等,则必须首先通过调用connectToHost()将套接字直接连接到对等端。
我直接在connectToHost()之后打电话给bind()
socket.bind(QHostAddress::LocalHost, 14560);
socket.connectToHost(QHostAddress::LocalHost, 14560);现在它可以读,但它不发射readyRead()信号。使用QIODevice函数的正确方法是什么?
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.0clang x64。操作系统: macOS塞拉利昂10.12.2。
发布于 2017-01-02 19:29:07
在我看来,将、bind、和connectToHost一起使用是不正确的。
绑定方法必须用于UDP服务器,而connectToHost方法只能用于UDP客户端。因此,只需尝试省略connectToHost调用,您将在14560端口上接收到传入的数据报。
Qt文档中的绑定方法描述:
对于UDP套接字,绑定后,每当UDP数据报到达指定地址和端口时,发出信号QUdpSocket::readyRead()。因此,此函数对于编写UDP服务器非常有用。
https://stackoverflow.com/questions/41432095
复制相似问题