udp c语言实现组播的例子

一、组播与广播的区别

1、组播地址和广播地址是不同的概念

  • 组播地址:用于将数据包发送到一组特定的接收者,只有加入该组播地址的设备才能接收数据。它提高了网络效率,因为发送者只需发送一份数据。

  • 广播地址:用于将数据包发送到同一网络中的所有设备。所有接收设备都会接收广播消息,因此广播的范围更广,但会增加网络负担。

简单来说,组播是"对特定组发送",而广播是"对所有发送"

2、常用的广播地址

  1. 局域网广播地址 :通常是子网的最高地址。例如,对于子网 192.168.1.0/24,广播地址是 192.168.1.255

  2. 全局广播地址 :在IPv4中,255.255.255.255 是一个特殊的广播地址,表示发送给同一网络中的所有设备。

  3. 特定服务的广播地址:某些协议使用特定的广播地址,例如:

    • DHCP :使用 255.255.255.255 进行请求。
    • ARP:在局域网中,用于地址解析。

3、常用的组播地址

组播地址有很多,通常分为几个范围。以下是一些常见的组播地址及其用途:

  1. 224.0.0.0 到 224.0.0.255:这个范围被称为"本地网络组播地址",主要用于局域网内部的通信。它们通常被网络协议和服务使用,比如:

    • 224.0.0.1:所有组播成员
    • 224.0.0.2:所有路由器
  2. 224.0.1.0 到 238.255.255.255:这些地址通常用于特定的应用程序和服务。开发者可以在这个范围内选择组播地址,但需要确保不会与已知服务冲突。

  3. 239.0.0.0 到 239.255.255.255:这个范围通常被称为"临时组播地址",可以被用户和开发者自由使用。具体的地址可以根据应用需求来选择。

  4. FF00::/8:这是IPv6的组播地址范围,类似于IPv4中的D类地址。IPv6的组播地址有多种用途,包括用于特定服务和协议的发现。

二、组播服务器接收代码 recevier.c

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>

#define PORT 12345
#define GROUP "239.255.255.250"

int main() {
    int sockfd;
    struct sockaddr_in local_addr;
    struct ip_mreq group;
    char buffer[1024];
    int nbytes;

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    memset(&local_addr, 0, sizeof(local_addr));

    local_addr.sin_family = AF_INET;
    local_addr.sin_addr.s_addr = INADDR_ANY;
    local_addr.sin_port = htons(PORT);

    bind(sockfd, (struct sockaddr*)&local_addr, sizeof(local_addr));

    group.imr_multiaddr.s_addr = inet_addr(GROUP);
    group.imr_interface.s_addr = htonl(INADDR_ANY);
    setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &group, sizeof(group));

    printf("Waiting for broadcast messages... %s\n", GROUP);
    while (1) {
        nbytes = recvfrom(sockfd, buffer, sizeof(buffer), 0, NULL, NULL);
        if (nbytes < 0) {
            perror("recvfrom");
            exit(1);
        }
        buffer[nbytes] = '\0';
        printf("Received: %s\n", buffer);
    }

    close(sockfd);
    return 0;
}

三、组播发送方代码 sender.c

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>

#define PORT 12345
#define GROUP "239.255.255.250"

int main() {
    int sockfd;
    struct sockaddr_in group_addr;
    char *messageText = "I am server. Hello, Multicast!";

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    memset(&group_addr, 0, sizeof(group_addr));
    
    group_addr.sin_family = AF_INET;
    group_addr.sin_addr.s_addr = inet_addr(GROUP);
    group_addr.sin_port = htons(PORT);

    int nCount = 0;
    while (1) {
        char message[256] = {0};
        sprintf(message, "%s %s %d", __TIME__,  messageText, nCount++);
        sendto(sockfd, message, strlen(message), 0, (struct sockaddr*)&group_addr, sizeof(group_addr));
        printf("Message sent: %s\n", message);
        sleep(1);
    }

    close(sockfd);
    return 0;
}

四、编译、运行

cpp 复制代码
gcc sender.c -o sender

gcc receiver.c -o receiver

./receiver
相关推荐
喜欢吃豆1 分钟前
[特殊字符] 深入解构 Assistants API:从“黑盒”抽象到“显式”控制的架构演进与终极指南
网络·人工智能·自然语言处理·架构·大模型
好望角雾眠4 分钟前
第四阶段C#通讯开发-5:TCP
网络·笔记·网络协议·tcp/ip·c#
深圳南柯电子9 分钟前
深圳南柯电子|医疗电子EMC整改:助医疗器械安全稳定的关键环节
网络·人工智能·安全·互联网·实验室·emc
报错小能手1 小时前
计算机网络自顶向下方法41——网络层 自治系统内部的路由选择:开放最短路优先(OSPF)设置OSPF链路权值
网络·计算机网络·智能路由器
国科安芯2 小时前
多输出电压条件下同步整流效率测试与优化
网络·单片机·嵌入式硬件·安全
东方隐侠安全团队-千里3 小时前
第3节 RSA算法开启公钥加密时代
网络·人工智能·算法
njnu@liyong4 小时前
HTTP-http是什么?
网络·网络协议·http
李宥小哥4 小时前
结构型设计模式2
网络·数据库·设计模式
xian_wwq4 小时前
【学习笔记】《孙子兵法》与网络安全
网络·笔记·学习
猫头虎5 小时前
永久免费白嫖多个域名,一键托管Cloudflare,免费申请SSL加密证书,轻松建站、搭建线路伪装
服务器·开发语言·网络·数据库·python·网络协议·ssl