引起多网卡组播接收不到数据的原因
- 确定多网卡组播需要绑定网卡
- 禁用工作网卡之外的网卡测试程序正常
- 删除winpacp等软件,测试是否与程序存在冲突
- 关闭防火墙,测试是否端口被禁用或程序被屏蔽
- 需要先发送数据才能接收到数据
多网卡组播程序关键点
if(udp == nullptr)
{
udp = new QUdpSocket(this);
}
udp->setSocketOption(QAbstractSocket::MulticastLoopbackOption,1);
if(!udp->bind(QHostAddress::AnyIPv4,mcport,QAbstractSocket::ShareAddress|QAbstractSocket::ReuseAddressHint)) //绑定端口
{
qDebug() << "bind udp fail!" ;
return;
}
else
{
bool ok = false;
//获取所有的网络接口
QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();
foreach(QNetworkInterface intf, list)
{ //遍历所有接口
foreach (QNetworkAddressEntry entry, intf.addressEntries())
{ // 遍历每个网卡
if(entry.broadcast() != QHostAddress::Null && entry.ip()!= QHostAddress::LocalHost
&& entry.ip().protocol() == QAbstractSocket::IPv4Protocol)
{
if(QHostAddress(ip) == entry.ip())
{//
udp->setMulticastInterface(intf);//设置组播网卡
bool result = udp->joinMulticastGroup(QHostAddress(mcIP),intf);//加入组播
udp->setSocketOption(QAbstractSocket::ReceiveBufferSizeSocketOption,1024*1024*8);//设置缓冲区
break;
}
}
}
}
qDebug() << "join mc";
}
接收数据
while (udp->hasPendingDatagrams())
{
QByteArray datagram;
datagram.resize(udp->pendingDatagramSize());
QHostAddress sender = QHostAddress(ipaddress);
quint16 senderPort = port;
udp->readDatagram(datagram.data(), datagram.size(),&sender, &senderPort);
processTheDatagram(datagram);
}
发送数据
udp->writeDatagram(datagram.data(),datagram.size(),QHostAddress(mcIP),mcport);