好的,使用Qt实现UDP单播通信的方法如下:
- 创建一个QUdpSocket对象
QUdpSocket *socket = new QUdpSocket(this);
- 绑定端口号
socket->bind(QHostAddress::AnyIPv4, 8080);
- 发送数据
QByteArray datagram = "Hello World!";
QHostAddress receiverAddress("192.168.0.100");
quint16 receiverPort = 8888;
socket->writeDatagram(datagram, receiverAddress, receiverPort);
- 接收数据
在槽函数中连接readyRead()信号,当有数据可读时,会自动触发该函数。
void MyClass::readPendingDatagrams()
{
while (socket->hasPendingDatagrams()) {
QByteArray datagram;
datagram.resize(socket->pendingDatagramSize());
QHostAddress sender;
quint16 senderPort;
socket->readDatagram(datagram.data(), datagram.size(),
&sender, &senderPort);
// 处理接收到的数据
}
}
完整示例代码如下:
发送方:
#include <QtNetwork>
int main(int argc, char **argv)
{
QApplication app(argc, argv);
QUdpSocket *socket = new QUdpSocket();
QByteArray datagram = "Hello World!";
QHostAddress receiverAddress("192.168.0.100");
quint16 receiverPort = 8888;
socket->writeDatagram(datagram, receiverAddress, receiverPort);
return app.exec();
}
接收方:
#include <QtNetwork>
class MyClass : public QObject
{
public:
MyClass(QObject *parent = nullptr)
: QObject(parent)
{
QUdpSocket *socket = new QUdpSocket(this);
connect(socket, &QUdpSocket::readyRead, this, &MyClass::readPendingDatagrams);
socket->bind(QHostAddress::AnyIPv4, 8888);
}
private slots:
void readPendingDatagrams()
{
while (socket->hasPendingDatagrams()) {
QByteArray datagram;
datagram.resize(socket->pendingDatagramSize());
QHostAddress sender;
quint16 senderPort;
socket->readDatagram(datagram.data(), datagram.size(),
&sender, &senderPort);
qDebug() << "Received: " << datagram;
}
}
private:
QUdpSocket *socket;
};
int main(int argc, char **argv)
{
QApplication app(argc, argv);
MyClass myObj;
return app.exec();
}
希望这个回答能够解决你的问题。