hitzsf |
2022-01-24 17:31 |
多网卡的QUdp 组播
组播的用处其实不大, 有时在局域网中提供一个服务,比如提供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()); } }
|
|