16 QT 的网络组播程序

在一个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);

///
接收端:

  1. 接收端创建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接收数据

完整工程源码:
http://download.csdn.net/detail/jklinux/9842550

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值