继串口踩坑后,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);
哈哈哈