在一个linux系统下,有可能有多个网卡, 每网卡又有可能有多个IP地址.
在QT里用QNetworkInterface对象表示一个网卡, QNetworkAddressEntry表示一个网卡的IP地址
//以下代码表示获取一个系统里的所有网卡信息,每个网卡的IP地址
QList<QNetworkInterface> list;
QList<QNetworkAddressEntry> list_addrs;
QNetworkInterface intf;
list = QNetworkInterface::allInterfaces(); //获取系统里所有的网卡对象
for (int i = 0; i < list.size(); i++)
{
intf = list.at(i);
qDebug() << intf.name() << " " << intf.flags(); // 获取网卡的状态, 是否激活,能否广播组播等 .
list_addrs = intf.addressEntries(); // 一个网卡可以设多个地址,获取当前网卡对象的所有ip地址
for (int j = 0; j < list_addrs.size(); j++)
qDebug() << list_addrs.at(j).ip().toString();
qDebug() << "###############";
}
程序执行的输出:
“lo” QFlags(0x1|0x2|0x8)
“127.0.0.1”
“::1”
###############
“enp1s0” QFlags(0x1|0x4|0x20)
“192.168.1.10”
###############
“enp3s0” QFlags(0x1|0x2|0x4|0x20)
“192.168.250.250”
“192.168.2.250”
“fe80::2e0:4cff:fe1d:7b1f%enp3s0”
###############
“virbr0” QFlags(0x1|0x4|0x20)
“192.168.122.1”
###############
“virbr0-nic” QFlags(0x4|0x20)
###############
//
组播的实现:
发送端:
1. 发送端找到处在工作状态,并能支持组播的网卡设备` QList list;
QNetworkInterface intf;
list = QNetworkInterface::allInterfaces(); //获取系统里所有的网卡对象
for (int i = 0; i < list.size(); i++)
{
intf = list.at(i);
QNetworkInterface::InterfaceFlags flags = intf.flags();
//找出处在执行状态,能支持组播的网卡对象
if ((flags & QNetworkInterface::IsRunning) && (flags & QNetworkInterface::CanMulticast))
break;
}
`
2. 创建udp对象,绑定地址与端口号,并指定使用哪个网卡设备发出组播包
udp = new QUdpSocket(this);
if (!udp->bind(QHostAddress::AnyIPv4, PORT))
{
QMessageBox::critical(this, "error", "bind failed");
exit(0);
}
udp->setMulticastInterface(intf);
3 往组播地址发出数据
udp->writeDatagram(str.toUtf8(), QHostAddress(MULTI_ADDR), PORT);
///
接收端:
- 接收端创建udp对象,绑定地址端口号
udp = new QUdpSocket(this);
if (!udp->bind(QHostAddress::AnyIPv4, PORT))
{
QMessageBox::critical(this, "error", "bind failed");
exit(0);
}
2 加入网络组
if (!udp->joinMulticastGroup(QHostAddress(MULTI_ADDR)))
{
QMessageBox::critical(this, "error", "join multicast group failed");
exit(0);
}
3 连接udp的readyRead信号到一个槽函数,在槽函数里readDatagram接收数据