精华内容
下载资源
问答
  • UDP单播组播测试sample

    2020-07-14 16:13:33
    附件包含采用C语言实现的UDP单播 组播参考sample代码 里面包含多个sample代码 供学习使用。
  • UDP单播发送与接收.c

    2019-07-03 16:09:51
    UDP单播,发送与接收(代码)详细介绍。单播流程:主机A向主机B发送UDP数据报,发送的目的IP为192.168.1.151,端口为 80,此数据经过UDP层、IP层,到达数据链路层,数据在整个以太网上传播。
  • C++组播和单播代码,包括server端和client端的全部封装代码和测试代码。支持windows经过72小时性能测试,没有问题。
  • 轻量级的GNU / Linux守护程序安装在LAN路由器上,可通过RTSP和单播RTP协议按需访问UDP多播流。 从0.2版开始,支持常规的HTTP“连续下载”流方法。 服务器本身不支持任何文件的流传输,它只能接收ISP提供的传入多播流...
  • 整理的用Qt实现的三种Udp方式:单播、组播(多播)和广播源代码,可以很好的看出三种方式的发送接收的区别,简单直接一看就懂得干货。
  • aeron-go在Go中实现Aeron消息传递客户端。 可以在此处找到Aeron的体系结构,设计和协议。在此处可以找到用法示例订户。 示例出版物可在此处找到。 aeron-go在Go中实现Aeron消息传递客户端。 可以在此处找到Aeron的...
  • aeron, 高效可靠的UDP单播UDP多播和IPC消息传输 Aeron 与其他Aeron用户和贡献者进行聊天。 高效可靠的UDP单播。UDP多播和IPC消息传输。 Java和 C 客户机在这个存储库中可用,并且可以从方提供一个 .NET 客户机插件。...
  • UDP单播通信测试案例,C#编写,希望对大家有用
  • windows下使用UDP的简单实例,包括单播、广播和多播的实例代码,使用VS2010编写
  • 交换机对收到的未知单播帧通常采取洪泛的方式进行处理,当交换机接收处理的未知单播帧数量和速率过大时,将消耗大量的交换机资源和网络带宽,影响正常的数据转发,攻击者可以利用交换机的未知单播洪泛机制发起网络...
  • 受到负载均衡两阶段Birkhoff-von Neumann架构的启发,该架构可为各种单播流量提供100%的吞吐量,这是一种新颖的3阶段架构,包括用于多播扇出拆分的第一阶段,用于负载的第二阶段平衡,并提出了切换的最后阶段...
  • 针对多波束卫星系统单播组播共存情况下的功率分配问题,提出了一种多目标优化设计方案。考虑同一组播流在不同波束下的一致性、数据流之间共享关口站上行链路带宽的公平性以及各个业务流的平均速率三项性能指标,构造了...
  • QT实现UDP通信,分客户端、服务端进行数据收发。包含单播、多播、组播。
  • 程序优化后的umeng友盟工具类,如果有什么不懂得再通过项目中的readme找我,单播、组播、广播。。。。。。。。。。
  • 为提高基于单播测量的网络链路时延分布估计速度,提出了一种基于显式计算的单播链路时延快速估计方法。由于网络设备多样化导致链路时延特征存在差异,首先根据端到端测量数据为各链路分配不同的离散间隔;然后利用背...
  • 详细地介绍单播 多播 组播的广播区别,适用于初学者。
  • 周立功网络调试软件,网络故障分析必备,也可用于网络编程模拟器。亲测可用
  • UDP通讯 WPF 广播 单播

    2014-01-09 16:10:17
    WPF+C#广播和单播示例 实现功能:添加聊天组 显示聊天组成员 多人聊天和单聊 界面简单,目的在于联系UDP通讯,对于图片的处理还未完成,Demo中的保存数据按钮目前没添加功能,欢迎大家一块研究
  • NOMA辅助多播-单播流的频谱效率和安全性增强
  • 单播委托.pdf

    2019-08-07 22:05:03
    本pdf是游戏开发中的委托与事件教学环节的第一个讲义,委托引入与单播委托
  • 单播通信实验

    2017-07-19 23:28:15
    掌握 TCP 服务器程序和客户程序的编程流程;熟悉面向连接的 C/S 程序使用的 winsock API。
  • 形象描述视频监控系统中对单播和组播的应用过程。
  • 网络编码中多单播猜想的一种简化方法
  • Aeron-go 在Go中实现消息传递客户端。 您可以在找到Aeron的架构,设计和协议 用法 示例订户可以在找到。 示例出版物可在找到。 常见的 使用上下文实例化Aeron: ctx := aeron ....a := aeron ....
  • 针对QoS的问题, 设计了一种融合遗传算法和模拟退火算法的QoS路由算法, 在遗传算法选择算子上借鉴了小生境的思想, 避免了遗传初期有效基因的丢失; 在遗传算法交叉算子和变异算子方面使用了自适应算子, 使之能更好地...
  • 网络基本知识,单播、多播和广播的比较
  • IPv6地址、单播、多播/组播介绍

    千次阅读 2021-04-17 17:25:52
    IPv6地址、单播、多播/组播介绍 1. IPv6地址介绍 这里主要介绍IPv6地址,什么是IP地址就不介绍了。 IPv6地址主要是为了解决IPv4地址枯竭的问题。 1.1 IPv6地址的格式 IPv6地址有128位,通常使用16进制表示,一个16...

    IPv6地址、单播、多播/组播介绍

    1. IPv6地址介绍

    这里主要介绍IPv6地址,什么是IP地址就不介绍了。

    IPv6地址主要是为了解决IPv4地址枯竭的问题。

    1.1 IPv6地址的格式

    IPv6地址有128位,通常使用16进制表示,一个16进制数可以表示4位二进制,因此128位可以使用32个16进制数表示,而把4个16进制数又分成一组,因此128位可以表示成8组。

    如下图所示,一个X表示一组(4个)16进制字符串,也就是一组包含了16个二进制。一共有8组。

    image-20210417154840638

    图片来源:《IPv6 Fundamentals A Straightforward》

    1.2 IPv6地址简写方式

    一个完整的IPv6地址有32个十六进制字符串表示,太长了,可以简写,简写规则有两种:

    1. 省略每一组开头的0
    2. 省略连续的若干个0,使用两个冒号::表示省略的0。

    1.2.1 省略开头的0

    使用第一种简写规则,省略开头的0,如下图所示:

    image-20210417155501703

    1.2.2 使用双冒号代替连续的0

    如果使用第二种规则,省略连续的0,使用两个冒号表示::,如下图:

    image-20210417155636668

    1.2.3 两种方式结合

    如果把两种规则结合起来,也是最常见的写法,如下图:

    image-20210417155832702

    1.2.4 简写时注意事项

    1. 双冒号::只能在IPv6地址中出现一次
      比如地址:ffff:0000:0000:ffff:0000:0000:0000:0001,就不能写成:ffff::ffff::0001,因为这样写根本不知道原来的地址是什么样的。
    2. 使用双冒号::代替连续0最多的
      比如地址:ffff:0000:0000:ffff:0000:0000:0000:0001,后面有连续的三组都是0,因此应该使用双冒号::代替这里,因此标准简写应该是ffff:0000:0000:ffff::00001
    3. 连续的0出现位置一样多,双冒号代替先出现的(最左边的)。
      比如地址:ffff:0000:0000:ffff:ffff:0000:0000:ffff,第一二组是连续的0,第六七组也是连续的0,标准写法应该是只能使用双冒号::代替先出现的,也就是第一二组,标准写法为:ffff::ffff:ffff:0000:0000:ffff

    1.3 IPv6地址分类

    IPv6地址分类基本可以如下图所示:

    image-20210417161712823

    IPv6地址可以分为三种类型:单播地址、多播地址、任播地址。

    2. 单播地址unicast

    如上图,单播地址可以分为6种:

    1. Global Unicast
    2. Link-Local Unicast
    3. Loopback
    4. Unspecified
    5. Unique Local
    6. Embedded IPv4

    2.1 Global Unicast Address

    全局单播地址Global Unicast Address前缀是2000::/3/3表示子网掩码,表示前面3位是固定的,跟IPv4掩码一样的。

    全局单播地址全局唯一,不会重复,全局单播地址Global Unicast Address就像我们IPv4的公网IP地址

    2.2 Link-Local Unicast

    Link-Local Unicast 前缀是fe80::/10,用于一个局域网内,不同的局域网的Link-Local地址可以重复。

    类似IPv4的私网IP,比如IPv4的192.168.0.1

    2.3 Loopback

    回环地址Loopback前缀是::1/128,使用回环地址的数据包不会经过网卡,回环地址用于本地测试。

    跟IPv4的回环地址127.0.0.1是一样的。

    2.4 Unspecified

    unspecified未指定的,这个地址固定就是全0,表示没有IPv6地址。

    2.5 Unique Local

    看名字,有个单词local,这个地址也是用于局域网,但是不同局域网的Unique Local Address不会重复。

    那么不同的局域网如何保证产生的地址不重复呢?这涉及到一个算法,这里就不介绍了,这个地址的生成就类似UUID的生成。

    2.6 Embeded IPv4

    这个地址就是把IPv4地址包含在IPv6地址中,把IPv6地址的高80位全部设置为0, 然后中间16位设置为1, 低32位设置为IPv4地址。如下图:

    image-20210417163307557

    3. 多播地址multicast

    还是这个图,怕看到这里忘了,再放一次:

    image-20210417163442624

    多播地址有很多种,重要的有三种:

    1. Well-Known
    2. Transient
    3. Solicited-Node

    3.1 多播地址格式介绍

    如下图:

    每个字段的意思图上都有解释,主要说说Scope字段,这个字段表示了多播的范围,按照字面意思可能不好理解,如下图:

    3.1 Well-Known

    Well-Known 多播地址前缀是ff00::/12,也就是最常见的多播地址。

    image-20210417164903410

    注意:

    ​ IPv6没有广播地址,Well-Known多播地址包含了广播地址,比如上图中第一条地址,多播给多有设备,就是广播。

    3.2 Transient

    这个,,先不讲了

    3.3 Solicited-Node

    这个,,有点没看懂,简单说说。。。

    Solicited-Node多播地址前缀是ff02:0:0:0:0:1:ff00::/104

    书上说Solicited-Node多播地址用于主要用于NDP(Neighbor Discovery Protocol)协议,NDP协议的功能有两个:

    1. Address resolution
    2. Duplicate Address Detection (DAD)

    NDP协议的Address resolution功能就类似IPv4的ARP协议,名字都一样,就是根据IP地址请求MAC地址。

    DAD功能是用来检测局域网中的所有设备的单播地址都是不同的。

    3.3.1 单播地址到Solicited-Node多播地址的映射

    Solicited-Node多播地址前104位是固定的,还剩下的24位则是来自单播地址,这剩下24位和单播地址是相同的。

    如下图,把单播地址的低24位拷贝过来,作为Solicited-Node多播地址的低24位。

    image-20210417171127850

    image-20210417171217041

    如上图,这个单播地址可以是全局单播地址,也可以是Link-Local单播地址。

    3.3.2 Solicited-Node多播地址到MAC地址的映射

    这个映射提现了多播地址比广播地址好的地方。。。。

    Solicited-Node多播地址要映射到MAC地址上,就是Mac地址的高12位不变,低32位改为Solicited-Node多播地址的低32位。如图所示:

    我之前以为MAC地址是固定不变了,原来可以改变。

    这里我有个疑惑,每个设备有个公网地址Global Unicast Address,也有一个私网地址Link-Local Unicast Address,那这样不是会产生两个Mac地址吗????

    这样映射有什么好处?

    ​ 多播地址只能用于目的地址,因此这样的数据包发出去后,目标设备接收时,只看Mac地址就可以知道,是不是发给自己的,就不用拆包查看IP地址了。

    4. IPv6地址查看

    查看了自己电脑的IP,如下图:

    image-20210417172219006

    可以确定的是有一个回环地址:::1/128,还有个Link-Local地址:fe80::b105:a91f:85a5:e1ef/64

    参考资料

    《IPv6 Fundamentals A Straightforward》

    展开全文
  • 主要对单播,多播,以及广播技术做了讲解,讲解很细,可以让你基本掌握有关此的相关内容
  • QT UDP通信(单播、广播、组播)

    千次阅读 热门讨论 2021-03-22 21:50:26
    单播:一个UDP客户端发出的数据报只发送到另一个指定地址和端口的UDP客户端,是一对一的数据传输。 广播:一个UDP客户端发出的数据报,在同一网络范围内其他所有的UDP客户端都可以收到。 组播:也称多播,UDP客户端...

    1.QUdpSocket

    UDP是轻量的、不可靠的、面向数据报、无连接的协议,它可以用于对可靠性要求不高的场合,与TCP通信不同,无需建立持久的socket连接。

    QUdpSocket用于实现UDP通信,与QTcpSocket主要区别是,QUdpSocket以数据报传输数据,而不是以连续的数据流。发送数据使用writeDatagram(),数据报的长度一般少于512字节,每个数据报包含发送者和接收者的IP地址和端口等信息。

    要进行UDP通信,首先需要bind函数绑定一个端口,用于接收传入的手机不能。当有数据报传入时会发射readyRead()信号,使用readDatagram()来读取接收到的数据报。

    UDP消息传送有单播、广播、组播三种模式。

    • 单播:一个UDP客户端发出的数据报只发送到另一个指定地址和端口的UDP客户端,是一对一的数据传输。
    • 广播:一个UDP客户端发出的数据报,在同一网络范围内其他所有的UDP客户端都可以收到。
    • 组播:也称多播,UDP客户端加入到另一个组播IP地址指定的多播组,成员向组播地址发送的数据报组内成员都可以接收到,类似于QQ群功能。

    在单播、广播和多播下,UDP程序都是对等的,不像TCP那样分为客户端和服务器端。单播和广播的实现方式基本相同,只是数据报的目标IP地址设置不同,多播模式需要加入多播组,实现方式有较大差异。

    2.单播/广播

    本机运行两个实例需要绑定不同的端口,例如实例A绑定端口2000,实例B绑定端口3000,实例A向实例B发送数据时,需要指定实例B所在主机的IP地址、绑定端口作为目标地址和目标端口,这样实例B才能接收到数据报。如果在不同的计算机运行,则可以使用相同的端口。

    • 要实现数据接收,必须先使用QUdpSocket::bind()绑定一个端口,用于监听传入的数据报。解除绑定则使用abort()函数。
    • writeDatagram()函数向一个目标用户发送消息时,需要指定目标地址和端口。
    • 在广播消息时,只需要将目标地址更换为一个特殊地址,即广播地址QHostAddress::Broadcast,一般为255.255.255.255
    • 发送的数据报是QByteArray类型的字节数组,数据报的长度一般不超过512字节,可以是文本,也可以是二进制数据。
    • 接收到数据报后会发射readyRead()信号。
    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include <QWidget>
    #include <QUdpSocket>
    
    namespace Ui {
    class Widget;
    }
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit Widget(QWidget *parent = 0);
        ~Widget();
    
    private slots:
        void on_btnBind_clicked();
    
        void on_btnUnBind_clicked();
    
        void on_btnClear_clicked();
    
        void on_btnQuit_clicked();
    
        void on_btnSend_clicked();
    
        void on_btnBroadcast_clicked();
    
        void on_readyRead();
    private:
        Ui::Widget *ui;
    
    private:
        QUdpSocket *m_udpSocket = nullptr;
    };
    
    #endif // WIDGET_H
    
    #include "widget.h"
    #include "ui_widget.h"
    #include <QHostInfo>
    
    Widget::Widget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Widget)
    {
        ui->setupUi(this);
    
    
        //本地主机名
        QString hostName = QHostInfo::localHostName();
    
        //本机IP地址
        QHostInfo hostInfo = QHostInfo::fromName(hostName);
    
        //IP地址列表
        QList<QHostAddress> addrList = hostInfo.addresses();
        for(int i=0;i<addrList.count();i++)
        {
            QHostAddress host = addrList.at(i);
    
            if(QAbstractSocket::IPv4Protocol == host.protocol())
            {
                QString ip = host.toString();
                ui->comboBox->addItem(ip);
            }
        }
    
        m_udpSocket = new QUdpSocket(this);
        connect(m_udpSocket,&QUdpSocket::readyRead,this,&Widget::on_readyRead);
    
    }
    
    Widget::~Widget()
    {
        delete ui;
    }
    
    void Widget::on_btnBind_clicked()
    {
        //本机UDP端口
        qint16 port = ui->spinBindPort->value();
    
        if(m_udpSocket->bind(port))
        {
            ui->plainTextEdit->appendPlainText("**已成功绑定");
            ui->plainTextEdit->appendPlainText("**绑定端口: "+QString::number(m_udpSocket->localPort()));
            ui->btnBind->setEnabled(false);
            ui->btnUnBind->setEnabled(true);
        }
        else
        {
             ui->plainTextEdit->appendPlainText("**绑定失败");
        }
    }
    
    void Widget::on_btnUnBind_clicked()
    {
        //解除绑定
        m_udpSocket->abort();
        ui->btnBind->setEnabled(true);
        ui->btnUnBind->setEnabled(false);
        ui->plainTextEdit->appendPlainText("**已解除绑定");
    }
    
    void Widget::on_btnClear_clicked()
    {
        ui->plainTextEdit->clear();
    }
    
    void Widget::on_btnQuit_clicked()
    {
    
    }
    
    void Widget::on_btnSend_clicked()//单播
    {
        //目标IP
        QString dstIp = ui->comboBox->currentText();
    
        QHostAddress dstAddr(dstIp);
    
        //目标端口
        quint16 dstPort = ui->spinDstPort->value();
    
        QString msg = ui->lineEdit->text();
        QByteArray str = msg.toUtf8();
    
        //发出数据报
        m_udpSocket->writeDatagram(str,dstAddr,dstPort);
    
        ui->plainTextEdit->appendPlainText("[out] "+msg);
    }
    
    void Widget::on_btnBroadcast_clicked()//广播
    {
        quint16 dstPort = ui->spinDstPort->value();
    
        QString msg = ui->lineEdit->text();
        QByteArray str = msg.toUtf8();
    
        //发出数据报
        m_udpSocket->writeDatagram(str,QHostAddress::Broadcast,dstPort);
    
        ui->plainTextEdit->appendPlainText("[Broadcast] "+msg);
    }
    
    void Widget::on_readyRead()
    {
        //是否还有待读取的传入数据报
        while(m_udpSocket->hasPendingDatagrams())
        {
            QByteArray data;
    
            //返回待读取的数据报的字节数
            data.resize(m_udpSocket->pendingDatagramSize());
    
            QHostAddress peerAddr;
    
            quint16 peerPort;
    
            //读取数据报的内容
            m_udpSocket->readDatagram(data.data(),data.size(),&peerAddr,&peerPort);
    
            QString str = data.data();
    
            QString peer = "[From ] +"+peerAddr.toString()+":"+QString::number(peerPort)+"] ";
    
            ui->plainTextEdit->appendPlainText(peer+str);
        }
    }
    

    3.组播

    组播是主机之间“一对一组”的通信模式,当多个客户端加入由一个组播地址定义的多播组之后,客户端向组播地址和端口发送数据报,组内成员都可以接收到,类似QQ群。

    UDP组播必须使用一个组播地址。组播地址是D类IP地址,有特定的地址段。多播组可以是永久的也可以是临时的。永久多播组保持不变的是它的IP地址,组内成员结构可以发生变化。

    • 224.0.0.0~224.0.0.255为预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其他地址供路由协议使用
    • 224.0.1.0~224.0.1.255是公用组播地址,可以用于internet
    • 224.0.2.0~238.255.255.255为用户可用的组播地址(临时组地址),全网范围内有效
    • 239.0.0.0~239.255.255.255为本地管理组播地址,仅在特定的本地范围内有效

    若在家庭或办公室局域网内测试UDP组播功能,可以使用组播地址范围是239.0.0.0~239.255.255.255

    joinMulticastGroup()函数使主机加入一个多播组,leaveMulticastGroup()函数使主机离开一个多播组。

    UDP组播的特点是使用组播地址,其他的端口绑定、数据报收发功能与单播UDP完全相同。

    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include <QWidget>
    #include <QUdpSocket>
    
    namespace Ui {
    class Widget;
    }
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit Widget(QWidget *parent = 0);
        ~Widget();
    
    private slots:
        void on_btnClear_clicked();
    
        void on_btnSend_clicked();
    
        void on_readyRead();
        void on_btnJoin_clicked();
    
        void on_btnExit_clicked();
    
    private:
        Ui::Widget *ui;
    
    private:
        QUdpSocket *m_udpSocket = nullptr;
    
        QHostAddress groupAddr; //组播地址
    };
    
    #endif // WIDGET_H
    
    #include "widget.h"
    #include "ui_widget.h"
    #include <QHostInfo>
    
    Widget::Widget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Widget)
    {
        ui->setupUi(this);
    
        //本地主机名
        QString hostName = QHostInfo::localHostName();
    
        m_udpSocket = new QUdpSocket(this);
    
        //socket QAbstractSocket::MulticastTtlOption值为1,MulticastTtlOption是
        //组播的数据的生存期,数据报没跨1个路由就会减1.表示多播数据报只能在同一路由下的局域网内传播
        m_udpSocket->setSocketOption(QAbstractSocket::MulticastTtlOption,1);
        connect(m_udpSocket,&QUdpSocket::readyRead,this,&Widget::on_readyRead);
    
    }
    
    Widget::~Widget()
    {
        delete ui;
    }
    
    
    void Widget::on_btnClear_clicked()
    {
        ui->plainTextEdit->clear();
    }
    
    void Widget::on_btnSend_clicked()//组播
    {
        //目标端口
        quint16 groupPort = ui->spinBindPort->value();
    
        QString msg = ui->lineEdit->text();
        QByteArray str = msg.toUtf8();
    
        //发出数据报
        m_udpSocket->writeDatagram(str,groupAddr,groupPort);
    
        ui->plainTextEdit->appendPlainText("[multicast] "+msg);
    }
    
    void Widget::on_readyRead()
    {
        while(m_udpSocket->hasPendingDatagrams())
        {
            QByteArray data;
            data.resize(m_udpSocket->pendingDatagramSize());
    
            QHostAddress peerAddr;
    
            quint16 peerPort;
    
            m_udpSocket->readDatagram(data.data(),data.size(),&peerAddr,&peerPort);
    
            QString str = data.data();
    
            QString peer = "[From ] +"+peerAddr.toString()+":"+QString::number(peerPort)+"] ";
    
            ui->plainTextEdit->appendPlainText(peer+str);
        }
    }
    
    void Widget::on_btnJoin_clicked()
    {
        QString IP = ui->comboBox->currentText();
        groupAddr = QHostAddress(IP);
    
        quint16 groupPort = ui->spinBindPort->value();
        //加入组播之前,必须先绑定端口,端口为多播组统一的一个端口。
        if(m_udpSocket->bind(QHostAddress::AnyIPv4,groupPort,QUdpSocket::ShareAddress))
        {
            //加入组播
            m_udpSocket->joinMulticastGroup(groupAddr);
    
            ui->plainTextEdit->appendPlainText("**加入组播成功");
            ui->plainTextEdit->appendPlainText("**组播IP: "+ IP);
            ui->plainTextEdit->appendPlainText("**绑定端口: "+QString::number(groupPort));
            ui->btnJoin->setEnabled(false);
            ui->btnExit->setEnabled(true);
            ui->comboBox->setEnabled(false);
        }
        else
        {
            ui->plainTextEdit->appendPlainText("**绑定端口失败");
        }
    }
    
    void Widget::on_btnExit_clicked()
    {
        //退出组播
        m_udpSocket->leaveMulticastGroup(groupAddr);
    
        //解除绑定
        m_udpSocket->abort();
    
        ui->btnJoin->setEnabled(true);
    
        ui->btnExit->setEnabled(false);
        ui->comboBox->setEnabled(true);
    
        ui->plainTextEdit->appendPlainText("**已退出组播");
    }
    

    展开全文
  • 图解交换机IP单播转发原理

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 269,005
精华内容 107,602
关键字:

单播