Qt中UDP使用双网卡广播

继串口踩坑后,udp继续掉坑里。

由于要做环形网,ARM板使用两个网卡,环形网不用设置路由,要想发送消息最好的方法就是直接广播。

其中,UDP绑定实用的有两种方法,

udpSocket1 = new QUdpSocket(this);

connect(udpSocket1, SIGNAL(readyRead()),this, SLOT(processPendingDatagrams1()));

//Any或者不指定IP

udpSocket1->bind(QHostAddress::AnyIPv4, 45454, QUdpSocket::ShareAddress);

//udpSocket1->bind(45454, QUdpSocket::ShareAddress);
//指定IP------------------------------------------------------------------

QHostAddress ip1(“192.168.1.1”);

udpSocket1->bind(ip1, 45454, QUdpSocket::ShareAddress);

==========================================================

发送UDP时,广播

udpSocket1->writeDatagram(datagram,QHostAddress::Broadcast,45454);

//指定IP

QHostAddress destination(“192.168.1.168”);

udpSocket1->writeDatagram(datagram,destination,45454);

===========================================================

好,问题来了,不绑定IP时,Any接收广播和自己IP的包没问题,但发送广播只有网卡1发送了广播包,QHostAddress::Broadcast默认使用的是第一个有效的网卡。

可是使用2个udpSocket分别绑定网卡1和网卡2,发送可以,绑定IP后广播包被直接滤掉了,无法收到广播包。

难道要出个下册,2个socket绑定,1个socket不绑定负责接收广播包,可是接收指定IP包2个socket会同时收到,还有别的麻烦。

后来看到有说使用C的socket,还有个说法轮询网卡发送广播,试了才领悟,QHostAddress应该包含网卡id,qt中QHostAddress源代码没去仔细看。

result1 = udpSocket1->bind(QHostAddress::AnyIPv4, 45454, QUdpSocket::ShareAddress);

if(result1)
        text2.append("bind success");
    else
        text2.append("bind failed");

foreach (QNetworkInterface netInterface, QNetworkInterface::allInterfaces())
    {
        qDebug()<< "humanReadableName:" <<netInterface.humanReadableName();
        qDebug()<< "hardwareAddress:" <<netInterface.hardwareAddress();
        qDebug()<< "name:" <<netInterface.name();
        QList<QNetworkAddressEntry> entryList = netInterface.addressEntries();

        //遍历每一个IP地址(每个包含一个IP地址,一个子网掩码和一个广播地址)
        foreach(QNetworkAddressEntry entry, entryList)
        {
            //IP地址
            QHostAddress broadcastAddress = entry.broadcast();
            qDebug()<< "ip:" << entry.ip().toString();
            qDebug()<< "netmask:" << entry.netmask().toString();

            if(broadcastAddress != QHostAddress::Null &&
                    entry.ip() != QHostAddress::LocalHost &&
                    entry.ip().protocol() == QAbstractSocket::IPv4Protocol)
            {

                // 我把每个网卡的广播QHostAddress 分别存储
                if("eth0" == netInterface.name())
                    broadcast1 = broadcastAddress;
                else if("eth1" == netInterface.name())
                    broadcast2 = broadcastAddress;
            }
        }
    }

在广播时,分别向两个网卡的QHostAddress 广播,果然,两边都收到了

udpSocket1->writeDatagram(txdata,broadcast1,45454);
udpSocket1->writeDatagram(txdata,broadcast2,45454);

哈哈哈

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好用的Qt串口网口通信层可以提供稳定、高效的串口和网口通信功能。Qt是一个跨平台的应用程序开发框架,具有丰富的功能和易用性。在Qt,可以使用SerialPort模块来实现串口通信,可以方便地设置串口参数、发送和接收数据。通过Qt的串口通信功能,可以实现与外部设备的数据交互。 另外,Qt还提供了Network模块,用于实现网口通信。在网口通信层,可以使用Qt的Socket类来创建TCP或UDP连接,实现数据的发送和接收。Qt的网口通信功能具有可靠的网络协议支持和良好的错误处理机制,可以满足复杂的网络通信需求。 好用的Qt串口网口通信层还应具备良好的可扩展性和兼容性。Qt的模块化设计使得开发人员可以根据自己的需求轻松地扩展功能,并且可以方便地在不同平台上进行开发和部署。此外,Qt的开源特性也为开发者提供了更多的灵活性和自由度。 总结起来,好用的Qt串口网口通信层应具备稳定、高效的串口和网口通信功能,拥有丰富的功能和易用性,并且具备良好的可扩展性和兼容性。这样的通信层能够满足开发者在串口和网口通信方面的需求,并且能够简化开发流程,提高开发效率。 ### 回答2: 好用的QT串口网口通信层是指一种基于QT开发框架的串口和网口通信的间层,它能够简化开发人员在QT项目进行串口和网口通信的工作。这个通信层具有以下几个特点: 1. 方便易用:好用的QT串口网口通信层提供了一套简洁的API,使得开发人员可以快速地在QT项目进行串口和网口通信的实现。只需简单的调用几个函数或方法,即可完成通信的配置和数据的发送与接收。 2. 可扩展性强:好用的QT串口网口通信层支持多种串口和网口通信协议,如RS232、RS485、TCP/IP等。开发人员可以根据实际需求选择相应的协议,并进行灵活的配置和定制。 3. 跨平台支持:QT是一个跨平台的开发框架,好用的QT串口网口通信层也能够在不同的操作系统上运行,如Windows、Linux、macOS等。这使得开发人员可以在不同的平台上进行串口和网口通信的开发,提高了项目的移植性和可扩展性。 4. 可靠稳定:好用的QT串口网口通信层经过严格的测试和验证,具有良好的稳定性和可靠性。它能够处理各种异常情况,如数据丢失、错误校验等,并提供相应的错误处理机制,保证通信的稳定性和可靠性。 总之,好用的QT串口网口通信层能够为开发人员提供便捷的串口和网口通信功能,使得在QT项目进行通信的实现更加简单高效。无论是在工业控制、物联网、嵌入式开发等领域,都可以广泛应用这个通信层来满足不同的通信需求。 ### 回答3: 好用的Qt串口和网络通信层涵盖了Qt框架用于串口和网络通信的库和类。Qt提供了一套全面的工具和接口,使我们可以轻松地在Qt应用程序实现串口和网络通信功能。以下是为什么它被认为是好用的主要原因: 1. 易于使用Qt提供了易于理解和使用的API,使开发人员能够在不浪费太多时间的情况下迅速上手。其文档和示例代码对于初学者来说也非常友好,可以快速学习和理解。 2. 跨平台性:Qt是一个跨平台的框架,具有卓越的跨平台能力。通过使用Qt的串口和网络通信层,我们可以轻松实现在不同操作系统上的串口和网络通信,而无需担心处理平台间的差异。 3. 强大的功能:Qt提供了丰富的功能和工具,包括读取和写入串口数据、配置串口参数、网络套接字等。无论是简单的串口通信还是复杂的网络通信,Qt都能够满足我们的需求。 4. 高效和稳定:Qt串口和网络通信层是经过优化和测试的,确保其高效性和稳定性。它可以处理大量的数据传输和并发连接,以满足大部分应用程序的需求。 5. 可扩展性:Qt提供了强大的可扩展性,可以通过自定义类和功能来满足特定的通信需求。我们可以基于Qt串口和网络通信层构建自己的高级通信功能,实现更复杂和特定的应用需求。 总之,Qt串口和网络通信层是一个功能强大且易于使用的工具,为我们的应用程序提供了可靠和高效的串口和网络通信功能。无论是用于连接硬件设备、远程监控还是其他通信需求,Qt提供的这一层都能满足我们的期望。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值