查看完整版本: [-- 多网卡的QUdp 组播 --]

QTCN开发网 -> Qt代码秀 -> 多网卡的QUdp 组播 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

hitzsf 2022-01-24 17:31

多网卡的QUdp 组播

组播的用处其实不大, 有时在局域网中提供一个服务,比如提供Qt RO网络中的注册中心的url, 可以考虑使用组播技术.
对于多网卡来说, udp加入组播地址,并绑定端口后,不一定能够收到客户端发送的查询消息,估计是因为消息所在的网络不一定就是绑定的网卡所在的网络,在虚拟机上测试时,会出现这种情况.
服务端在本机上执行, 客户端在虚拟机上执行,客户端向组播地址发送的消息,大概只能抵达虚拟网卡,而本机上的服务器绑定的网卡很有可能是实际的物理网卡,在NAT模式下,因为ip地址不在同一个网段,数据包不会继续传递,就会造成这种现象
解决的思路就是用每一个网口绑定一个udp就行.
  1. 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. // 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());
        }
    }






查看完整版本: [-- 多网卡的QUdp 组播 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled