udp多播/组播那些事

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

udp 广播,嵌入式网络技术,linux,arm开发,驱动开发,c语言,单片机

多播与组播

多播(multicast)和组播(groupcast)是相同的概念,用于描述在网络中一对多的通信方式。在网络通信中,单播(unicast)是一对一的通信方式,广播(broadcast)是一对所有的通信方式,而多播(或组播)是一对多的通信方式。

多播/组播通信允许一个发送者将数据包同时传输给多个接收者,这些接收者形成一个接收组(receiving group)或多播组(multicast group)。发送者只需发送一次数据包,而不需要为每个接收者单独发送。

只存在于udp

UDP协议支持多播和广播,而TCP协议不直接支持广播和多播。

UDP协议是一种无连接的协议,它允许应用程序通过多播地址或广播地址发送数据包。多播地址是一个预定义的IP地址范围,用于标识多播组,而广播地址则是一个特殊的IP地址,用于向网络中的所有主机发送数据包。

在UDP中,你可以使用特定的套接字选项设置多播地址,并使用sendto()函数发送数据包到多播组。接收端可以通过加入相同的多播组地址,使用recvfrom()函数接收多播数据包。

相比之下,TCP协议是一种面向连接的协议,它提供可靠的、有序的数据传输。TCP协议不直接支持多播和广播功能,因为它是基于点对点通信模型的,只能通过建立一对一的连接进行数据传输。

多播接收端程序

以下是一个使用C语言编写的简单示例,用于接收和发送多播数据包:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>

#define MULTICAST_GROUP "239.0.0.1" // 多播组地址
#define PORT 12345                 // 多播组的端口号
#define MAX_BUFFER_SIZE 1024       // 接收缓冲区大小

int main() {
    int sockfd;
    struct sockaddr_in multicastAddr;
    struct sockaddr_in clientAddr;
    char buffer[MAX_BUFFER_SIZE];

    // 创建UDP套接字
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0) {
        perror("socket creation failed");
        exit(EXIT_FAILURE);
    }

    // 设置套接字选项,允许接收多播数据
    int enable = 1;
    if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(enable)) < 0) {
        perror("setsockopt SO_REUSEADDR failed");
        exit(EXIT_FAILURE);
    }

    // 绑定到本地地址和端口
    memset(&clientAddr, 0, sizeof(clientAddr));
    clientAddr.sin_family = AF_INET;
    clientAddr.sin_addr.s_addr = INADDR_ANY;
    clientAddr.sin_port = htons(PORT);

    if (bind(sockfd, (struct sockaddr *)&clientAddr, sizeof(clientAddr)) < 0) {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }

    // 加入多播组
    struct ip_mreq multicastReq;
    multicastReq.imr_multiaddr.s_addr = inet_addr(MULTICAST_GROUP);
    multicastReq.imr_interface.s_addr = htonl(INADDR_ANY);
    if (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&multicastReq, sizeof(multicastReq)) < 0) {
        perror("setsockopt IP_ADD_MEMBERSHIP failed");
        exit(EXIT_FAILURE);
    }

    printf("Waiting for multicast messages...\n");

    while (1) {
        // 接收多播数据包
        socklen_t addrLen = sizeof(multicastAddr);
        ssize_t recvLen = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&multicastAddr, &addrLen);
        if (recvLen < 0) {
            perror("recvfrom failed");
            exit(EXIT_FAILURE);
        }

        buffer[recvLen] = '\0';
        printf("Received multicast message: %s\n", buffer);
    }

    // 关闭套接字
    close(sockfd);

    return 0;
}

在该示例中,我们使用socket()函数创建了一个UDP套接字,并使用setsockopt()函数设置了SO_REUSEADDR选项,以便允许套接字重新使用本地地址。然后,我们使用bind()函数将套接字绑定到本地地址和端口。

接下来,我们使用IP_ADD_MEMBERSHIP选项加入多播组,指定了多播组地址和本地网络接口。这样,套接字就可以接收到发送到指定多播组的数据包。

最后,我们使用一个循环来持续接收多播数据包。使用recvfrom()函数从套接字接收数据包,并打印接收到的消息。

请注意,接收端和发送端应该使用相同的多播组地址和端口号以进行通信。

多播发送断程序

以下是一个使用C语言编写的简单多播发送示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>

#define MULTICAST_GROUP "239.0.0.1" // 多播组地址
#define PORT 12345                 // 多播组的端口号

int main() {
    int sockfd;
    struct sockaddr_in multicastAddr;
    char *message = "Hello, Multicast!";

    // 创建UDP套接字
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0) {
        perror("socket creation failed");
        exit(EXIT_FAILURE);
    }

    // 设置多播组地址和端口号
    memset(&multicastAddr, 0, sizeof(multicastAddr));
    multicastAddr.sin_family = AF_INET;
    multicastAddr.sin_addr.s_addr = inet_addr(MULTICAST_GROUP);
    multicastAddr.sin_port = htons(PORT);

    // 发送多播数据包
    if (sendto(sockfd, message, strlen(message), 0, (struct sockaddr *)&multicastAddr, sizeof(multicastAddr)) < 0) {
        perror("sendto failed");
        exit(EXIT_FAILURE);
    }

    printf("Multicast message sent.\n");

    // 关闭套接字
    close(sockfd);

    return 0;
}

在这个示例中,我们创建了一个UDP套接字,并设置了多播组的地址和端口号。然后,使用sendto()函数将消息发送到多播组的地址。最后,关闭套接字。

注意事项

对于发送多播数据包的示例,不需要显式地绑定本地端口。

在发送端,我们只需创建一个UDP套接字并将数据包发送到多播组的地址。操作系统会自动选择一个本地端口进行发送。

接收端需要绑定本地端口是因为它需要告诉操作系统将接收到的多播数据包发送到哪个端口。

当接收端加入一个多播组时,它需要指定一个本地端口来接收多播数据包。通过将套接字绑定到一个特定的本地端口,操作系统会将接收到的多播数据包传递给该端口上运行的应用程序。

绑定本地端口的步骤通常在接收端的代码中进行,以便接收来自多播组的数据包。在之前提供的多播接收示例中,我们在接收端的代码中使用bind()函数将套接字绑定到本地地址和端口。

简而言之,接收端绑定本地端口是为了告诉操作系统将接收到的多播数据包传递给相应的应用程序,而发送端无需显式地绑定本地端口,操作系统会自动选择一个可用的本地端口进行发送。

udp 广播,嵌入式网络技术,linux,arm开发,驱动开发,c语言,单片机文章来源地址https://www.toymoban.com/news/detail-852302.html

到了这里,关于udp多播/组播那些事的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 嵌入式培训机构四个月实训课程笔记(完整版)-Linux网络编程第二天-TCP编程(物联技术666)

    点赞+关注,功德无量。更多配套资料,欢迎私信。 百度网盘 请输入提取码 百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固,支持教育网加速,支持手机端。注册使用百度网盘即可享受免费存储空间 https://pan.baidu.com/s/1F6BR6uTANKKcNnoaCUAZYA?pwd=

    2024年01月18日
    浏览(37)
  • 嵌入式培训机构四个月实训课程笔记(完整版)-Linux网络编程第二天-TCP编程练习(物联技术666)

    点赞+关注,功德无量。更多配套资料,欢迎私信。 百度网盘 请输入提取码 百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固,支持教育网加速,支持手机端。注册使用百度网盘即可享受免费存储空间 https://pan.baidu.com/s/1F6BR6uTANKKcNnoaCUAZYA?pwd=

    2024年02月01日
    浏览(42)
  • 嵌入式培训机构四个月实训课程笔记(完整版)-Linux网络编程第一天-socket编程练习(物联技术666)

    点赞+关注,功德无量。更多配套资料,欢迎私信。 网盘链接:https://pan.baidu.com/s/1NIrDmbm8EtFkB1G8s7E3Sg?pwd=qsoh 提取码:qsoh 1、建立一个服务器和一个客户端,二个之间通信 //--------------------服务器 #include stdio.h #include stdlib.h #include string.h                                    

    2024年02月01日
    浏览(38)
  • JavaCV音视频开发宝典:UDP局域网组播推流,多播推流,局域网多网段推流,使用UDP方式推送TS组播流,实现UDP一对多组播

    《JavaCV音视频开发宝典》专栏目录导航 《JavaCV音视频开发宝典》专栏介绍和目录 ​ 在之前文章中我们已经实现rtp点到点传输JavaCV音视频开发宝典:rtp点到点音视频传输(一对一音视频直播)和rtp广播JavaCV音视频开发宝典:rtp广播方式发送TS流音视频传输(一对多音视频会议

    2024年02月03日
    浏览(44)
  • 嵌入式学习第二十五天!(网络的概念、UDP编程)

        可以用来: 数据传输 、 数据共享     1. OSI协议模型: 应用层 实际收发的数据 表示层 发送的数据是否加密 会话层 是否建立会话连接 传输层 数据传输的方式(数据包,流式) 网络层 数据的路由(如何从一个局域网到达另一个局域网) 数据链路层 局域网下如何通信

    2024年03月17日
    浏览(47)
  • 【嵌入式学习】网络通信基础-项目篇:简单UDP聊天室

    源码已在GitHub开源:0clock/LearnEmbed-projects/chat 客户端功能: 上线发送登录的用户名[yes] 发送消息和接收消息[yes] quit退出 服务器端功能: 统计用户上线信息,放入链表中[yes] 接收用户信息并给其他用户发送消息[yes] 服务器也支持给所有用户群发消息[yes] 接收下线提醒

    2024年01月25日
    浏览(40)
  • udp多点通信-广播-组播

    单播 每次只有两个实体相互通信,发送端和接收端都是唯一确定的。 主机之间的一对多的通信 所有的主机都可以接收到广播消息(不管你是否需要) 广播禁止穿过路由器(只能做局域网通信) 只有UDP可以广播 广播地址 有效网络号+全是1的主机号 192.168.50.123 -----》 192.168.5

    2024年02月05日
    浏览(28)
  • 网络编程(三)—— UDP(单播、广播、组播)

    UDP协议的特点: 无连接 、不保证传输可靠(可能重复到达、失序、丢失、无字节流控制(数据传输快的会淹没慢的)) UDP传输 UDP 服务端(接收端)的搭建流程 UDP客户端(发送端)的搭建流程 通信流程 sendto 和 recvfrom 这两个函数一般在使用UDP协议时使用 sendto recvfrom 单播就

    2024年02月04日
    浏览(26)
  • Java UDP通信详解:单播、广播、组播

    1.UDP是一种无连接、不可靠传输的协议; 2.将数据源IP、目的地IP和端口封装成数据包,不需要建立连接 ; 3.每个数据包的大小限制在64KB内; 4.发送不管对方是否准备好,接收方收到也不确认,故是不可靠的; 5.可以广播发送 ,发送数据结束时无需释放资源,开销小,速度快

    2024年02月02日
    浏览(38)
  • [嵌入式系统-24]:RT-Thread -11- 内核组件编程接口 - 网络组件 - TCP/UDP Socket编程

    目录 一、RT-Thread网络组件 1.1 概述 1.2 RT-Thread支持的网络协议栈 1.3 RT-Thread如何选择不同的网络协议栈 二、Socket编程 2.1 概述 2.2 UDP socket编程 2.3 TCP socket编程 2.4 TCP socket收发数据 RT-Thread 是一个开源的嵌入式实时操作系统(RTOS),它提供了丰富的网络组件用于网络通信。 RT-

    2024年03月12日
    浏览(51)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包