组播的用处其实不大, 有时在局域网中提供一个服务,比如提供Qt RO网络中的注册中心的url, 可以考虑使用组播技术.
对于多网卡来说, udp加入组播地址,并绑定端口后,不一定能够收到客户端发送的查询消息,估计是因为消息所在的
网络不一定就是绑定的网卡所在的网络,在虚拟机上测试时,会出现这种情况.
服务端在本机上
执行, 客户端在虚拟机上执行,客户端向组播地址发送的消息,大概只能抵达虚拟网卡,而本机上的服务器绑定的网卡很有可能是实际的物理网卡,在NAT模式下,因为ip地址不在同一个网段,数据包不会继续传递,就会造成这种现象
解决的思路就是用每一个网口绑定一个udp就行.
- auto allInterface = QNetworkInterface::allInterfaces();
- for (int i = 0; i < allInterface.size(); ++i) {
- auto interface = allInterface.at(i);
- if (interface.flags() & QNetworkInterface::IsUp) {
- if (interface.flags() & QNetworkInterface::CanMulticast) {
- if (!interface.name().contains("loopback")) {
- auto udp = new QUdpSocket(this);
- udp->bind(QHostAddress::AnyIPv4, 62224,
- QAbstractSocket::ShareAddress | QAbstractSocket::ReuseAddressHint);
- udp->joinMulticastGroup(QHostAddress("224.2.2.2"), interface);
- connect(udp, &QUdpSocket::readyRead,
- this, &Widget::readPendingDatagrams);
- qout << interface;
- }
- }
- }
- }
然后在获取消息的槽函数处 获取客户端的 IP 和 port
- // 1. 多播接收,对点发送
- void Widget::readPendingDatagrams()
- {
- auto udp = (QUdpSocket*)sender();
- while (udp->hasPendingDatagrams()) {
- QNetworkDatagram datagram = udp->receiveDatagram();
- qout << "receive msg" << datagram.data();
- qout << datagram.senderAddress() << datagram.senderPort();
- QString msg = "tcp://192.168.101.121:9999";
- udp->writeDatagram(
- msg.toUtf8(),
- datagram.senderAddress(),
- datagram.senderPort());
- }
- }