• 2754阅读
  • 0回复

多网卡的QUdp 组播 [复制链接]

上一主题 下一主题
离线hitzsf
 

只看楼主 倒序阅读 楼主  发表于: 2022-01-24
组播的用处其实不大, 有时在局域网中提供一个服务,比如提供Qt RO网络中的注册中心的url, 可以考虑使用组播技术.
对于多网卡来说, udp加入组播地址,并绑定端口后,不一定能够收到客户端发送的查询消息,估计是因为消息所在的网络不一定就是绑定的网卡所在的网络,在虚拟机上测试时,会出现这种情况.
服务端在本机上执行, 客户端在虚拟机上执行,客户端向组播地址发送的消息,大概只能抵达虚拟网卡,而本机上的服务器绑定的网卡很有可能是实际的物理网卡,在NAT模式下,因为ip地址不在同一个网段,数据包不会继续传递,就会造成这种现象
解决的思路就是用每一个网口绑定一个udp就行.
  1. auto allInterface = QNetworkInterface::allInterfaces();
  2.     for (int i = 0; i < allInterface.size(); ++i) {
  3.         auto interface = allInterface.at(i);
  4.         if (interface.flags() & QNetworkInterface::IsUp) {
  5.             if (interface.flags() & QNetworkInterface::CanMulticast) {
  6.                 if (!interface.name().contains("loopback")) {
  7.                     auto udp = new QUdpSocket(this);
  8.                     udp->bind(QHostAddress::AnyIPv4, 62224,
  9.                         QAbstractSocket::ShareAddress | QAbstractSocket::ReuseAddressHint);
  10.                     udp->joinMulticastGroup(QHostAddress("224.2.2.2"), interface);
  11.                     connect(udp, &QUdpSocket::readyRead,
  12.                         this, &Widget::readPendingDatagrams);
  13.                     qout << interface;
  14.                 }
  15.             }
  16.         }
  17.     }

然后在获取消息的槽函数处 获取客户端的 IP 和 port
  1. // 1. 多播接收,对点发送
  2. void Widget::readPendingDatagrams()
  3. {
  4.     auto udp = (QUdpSocket*)sender();
  5.     while (udp->hasPendingDatagrams()) {
  6.         QNetworkDatagram datagram = udp->receiveDatagram();
  7.         qout << "receive msg" << datagram.data();
  8.         qout << datagram.senderAddress() << datagram.senderPort();
  9.         QString msg = "tcp://192.168.101.121:9999";
  10.         udp->writeDatagram(
  11.             msg.toUtf8(),
  12.             datagram.senderAddress(),
  13.             datagram.senderPort());
  14.     }
  15. }




4条评分好评度+1贡献值+1金钱+10威望+1
20091001753 好评度 +1 - 2022-01-24
20091001753 贡献值 +1 - 2022-01-24
20091001753 威望 +1 - 2022-01-24
20091001753 金钱 +10 - 2022-01-24
快速回复
限100 字节
 
上一个 下一个