UDP多播:一对多数据收发

这篇具有很好参考价值的文章主要介绍了UDP多播:一对多数据收发。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

多播

1.先来回顾一下,UDP广播。一个服务器进行广播,那么同一网络的所有主机都会收到信息。那么这个时候,有可能并不是所有主机都需要收到广播数据信息,只是一部分主机需要收到广播数据信息而已。
2.UDP通信中的多播。多播是向特定组中的所有的主机发送数据的方法,多播也称为组播。举个容易理解的例子:我们在qq/wechat 中有10个联系好友,拉了其中6个联系好友建立了一个群。那么其他4个好友肯定收不到群里的消息。
3.多播数据传输的特点:
3.1 多播是向特定组中的所有主机传输数据的方法,多播也称之为组播。
3.2 多播数据传输的特点。
a.多播发送者针对特定的多播组,只发送1次数据,组内主机均可收到数据
b.主机加入特定组,即可接收改组中的多播数据
c.多播组可在IP地址范围内任意增加

关键问题:如何收发多播数据?

1.多播组是一个D类地址(224.0.0.0 ~ 239.255.255.255)
2.加入多播组,可以理解为UDP网络程序进行的申请(也就是申请D类地址)
2.1 如:申请接收发往 239.234.111.222 的多播数据
2.2 即:设置熟悉(IPPROTO_IP,IP_ADD_MEMBERSHIP)
3.发送多播数据的方式,与发送普通UDP数据的方式相同
3.1 预备操作:设置熟悉,如:(IPPROTO_IP,IP_MULTICAST_TTL)

注意事项

1.加入同一个多播组的主机不一定在同一个网络中
2.因此,必须设置多播数据的最多转发次数(TTL)
3.TTL (即:Time to Live) 是决定数据传递距离的注意因素
4.TTL 用整数表示,并且每经过1个路由器就减少1
5.当TTL变为0时候,数据无法继续传递,只能销毁

多播程序设计:发送端

1.IP_MULTICAST_TTL :用于设置多播数据的 “最远传播距离”,默认:1
2.IP_MULTICAST_IF :用于设置多播数据从哪一个网络接口(网卡)发送出去:默认:0.0.0.0 (也就是让操作系统决定使用哪一个网口)
3.IP_MULTICAST_LOOP :用于设置多播数据是否发送会本机,默认:1

发送端:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main()
{
    int server = 0;
    struct sockaddr_in saddr = {0};
    int client = 0;
    struct sockaddr_in remote = {0};
    socklen_t asize = 0;
    int len = 0;
    char buf[32] = "Software";
    int r = 0;
    //int brd = 1;

    server = socket(PF_INET, SOCK_DGRAM, 0);

    if( server == -1 )
    {
        printf("server socket error\n");
        return -1;
    }

    saddr.sin_family = AF_INET;
    saddr.sin_addr.s_addr = htonl(INADDR_ANY); // 本机地址
    saddr.sin_port = htons(8888);

    if( bind(server, (struct sockaddr*)&saddr, sizeof(saddr)) == -1 )
    {
        printf("udp server bind error\n");
        return -1;
    }

    printf("udp server start success\n");

    remote.sin_family = AF_INET;
    remote.sin_addr.s_addr = inet_addr("224.1.1.168"); //设置一个多播地址
    remote.sin_port = htons(9000);

    // brd = 0;

    //setsockopt(server, SOL_SOCKET, SO_BROADCAST, &brd, sizeof(brd));

    while( 1 )
    {
        len = sizeof(remote);

        r = strlen(buf);
        
        sendto(server, buf, r, 0, (struct sockaddr*)&remote, len);

        sleep(1);
    }
    
    close(server);

    return 0;
}

接收端:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main()
{
    int sock = 0;
    struct sockaddr_in addr = {0};
    struct sockaddr_in remote = {0};
    int len = 0;
    char buf[128] = {0};
    char input[32] = {0};
    int r = 0;

    //多播
    struct ip_mreq group={0};

    sock = socket(PF_INET, SOCK_DGRAM, 0);

    if( sock == -1 )
    {
        printf("socket error\n");
        return -1;
    }

    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    addr.sin_port = htons(9000);

    if( bind(sock, (struct sockaddr*)&addr, sizeof(addr)) == -1 )
    {
        printf("udp bind error\n");
        return -1;
    }

    //remote.sin_family = AF_INET;
    //remote.sin_addr.s_addr = inet_addr("127.0.0.1");
    //remote.sin_port = htons(8888);

    group.imr_multiaddr.s_addr=inet_addr("224.1.1.168");
    group.imr_interface.s_addr=htonl(INADDR_ANY); //local host
    //这里INADDR_ANY 为0.0.0.0 通过看ipconfig/ifconfig 可以看到有多个
    //网络ip地址,这个时候让操作系统选择哪一个端口进行多播数据收发。
    //在实际的工程中需要明确指定需要哪一个网络地址进行多播数据收发,
    //不能完全依赖操作系统,否者有时候能够收到数据,有时候收不到数据。
    
    setsockopt(sock,IPPROTO_IP,IP_ADD_MEMBERSHIP,&group,sizeof(group));

    while( 1 )
    {
        len=sizeof(remote);

        r = recvfrom(sock, buf, sizeof(buf), 0, (struct sockaddr*)&remote, &len);

        if( r > 0 )
        {
            buf[r] = 0;

            printf("Receive: %s\n", buf);
        }
        else
        {
            break;
        }
    }

    close(sock);

    return 0;
}
运行结果:
发送端:
wj@ubuntu:~/DTSocket/17$ gcc mul_tx_server.c -o mul_tx_server.out
wj@ubuntu:~/DTSocket/17$ ./mul_tx_server.out 
udp server start success

接收端:
wj@ubuntu:~/DTSocket/17$ gcc mul_rx_client.c -o mul_rx_client.out
wj@ubuntu:~/DTSocket/17$ ./mul_rx_client.out 
Receive: Software
Receive: Software
Receive: Software

demo2:
//
//

小结:
1.单播:一对一数据发送,即:指定目标主机发送数据
2.广播:
2.1 本地广播:本地局域网广播数据,所有主机均可接收数据
2.2 直接广播:直接网络广播数据,目标网络中的主机均可接收数据。
3.多播(组播) :向指定的多播地址发送数据,“订阅”该地址的主机均可接收数据。文章来源地址https://www.toymoban.com/news/detail-521832.html

到了这里,关于UDP多播:一对多数据收发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java 发送和接收udp数据 udp数据帧结构

    项目开发中,有个需求是接收udp的组播信息,获取帧并解析其中的内容。之前没有接触过udp的通讯以及数据帧。查阅资料对udp的通讯间的发送与接收实现记录如下。 UDP有三种通讯方式,分别是, 单播 、广播、还有组播。 单播 : 单机与单机之间的通讯 广播 : 当前主机与所在

    2024年02月02日
    浏览(32)
  • 网络编程-UDP协议(发送数据和接收数据)

    需要了解TCP协议的,可以看往期文章 https://blog.csdn.net/weixin_43860634/article/details/133274701 通过此图,可以了解UDP所在哪一层级中 发送数据 接收数据 运行效果 1、 UDP是面向无连接通信协议 (通俗一点讲,就是不管是否已连接成功,直接发送数据),该特性正好与TCP协议相反,

    2024年02月07日
    浏览(38)
  • Linux 下 nc 发送接收 udp、tcp数据

    nc,全名叫 netcat,它可以用来完成很多的网络功能,譬如端口扫描、建立TCP/UDP连接,数据传输、网络调试等等,因此,它也常被称为网络工具的 瑞士军刀 。 一、只服务端使用nc 备注:这种方式只能发送一次数据,不能互相发送 1、udp发送接收数据,udp本质不区分客户端服务

    2024年02月16日
    浏览(39)
  • STM32 LWIP UDP 一对一 一对多发送

    之前没有接触过网络的通信,工作需要 UDP 接收和发送通信,在网上没有找到一对一、一对多的相关例程;于是在技术总监对我的指导,用正点原子板子给的例程是从官方的程序修改的,实现了Lwip UDP通信一对一、一对多的发送程序,可以随便指定发送 ip地址 、发送 端口号

    2024年02月15日
    浏览(47)
  • ESP32网络开发实例-UDP数据发送与接收

    本文将详细介绍在Arduino开发环境中,如何实现ESP32通过UDP协议进行数据发送与接收。 用户数据报协议 (UDP) 是一种跨互联网使用的通信协议,用于对时间敏感的传输,例如视频播放或 DNS 查找。它通过在数据传输之前不正式建立连接来加速通信。这使得数据可以非常快速地传输

    2024年02月07日
    浏览(43)
  • 利用c++基于ffmpeg库接收rtsp视频数据,并利用udp将以RTP协议将数据发送,同时利用udp接收RTP数据包,并基于ffmpeg库播放视频。

    这是两个不同的任务,需要分别实现。 任务一:基于ffmpeg库接收rtsp视频数据,并利用udp将以RTP协议将数据发送。 以下是基于ffmpeg库接收rtsp视频数据,然后使用udp发送RTP协议数据的示例代码: 任务二:利用c++利用udp接收RTP数据包,并基于ffmpeg库播放视频。 以下是利用c++利用

    2024年02月12日
    浏览(44)
  • Qt实现UDP发送与接收操作

    目录 一、为什么要写这篇文章,因为我就是要另辟蹊径,当然也是汲取了网上大咖们的经验,尽量简洁的进行总结 二、关于接收数据需的条件,需要绑定本地IP地址和端口号,可解释为此时为服务器模式,远端为客户端模式,实现的代码非常简单几行代码可以搞定 三、数据

    2024年02月11日
    浏览(54)
  • Java netty发送接收(TCP、UDP)

    最下方附项目地址 项目地址 https://gitee.com/xn-mg/netty_kafka

    2024年02月16日
    浏览(40)
  • TCP/IP UDP广播无法发送或接收

    在看《TCP/IP 网络编程》这本书的时候,看到广播那一节,跟着书上写代码,怎么写都不行,广播就是没法发送/接收,发送端一直在发送数据,接收端就是没有反应。 对了好几遍源码,没有问题。实在是愁人。 最后查了很多资料,确定是网卡的问题。 现在的计算机都是多网

    2024年02月04日
    浏览(49)
  • QT网络编程之实现UDP广播发送和接收

    一.UDP广播介绍 UDP广播地址固定IP地址为:XXX.XXX.XXX.255。 如果向全网段发送广播消息,那么广播地址为:255.255.255.255; 如果向单个网段发送广播消息,例如你的IP是192.168.31.104,那么广播地址为192.168.31.255。 广播消息接收方需要绑定0.0.0.0地址并监听指定端口即可收到广播的群

    2024年03月25日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包