1.组播介绍

  组播组可以是永久的也可以是临时的。组播组地址中,有一部分由官方分配的,称为永久组播组。

  永久组播组保持不变的是它的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  为本地管理组播地址,仅在特定的本地范围内有效。

  可使用ip ad命令查看网卡编号或者if_nametoindex() 函数可以根据网卡名,获取网卡序号。

2.代码实现

server.c

 #include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<strings.h>
#include<string.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<net/if.h> #define SERVER_PORT 8000
#define MAXLINE 1024
#define CLIENT_PORT 9000 #define GROUP "239.0.0.2" int main(int argc,char* argv[])
{
int sockfd;
struct sockaddr_in servaddr,clieaddr;
char buf[MAXLINE];
struct ip_mreqn group;
//构造用于UDP通信的套接字
sockfd = socket(AF_INET,SOCK_DGRAM,); bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERVER_PORT); bind(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr)); inet_pton(AF_INET,GROUP,&group.imr_multiaddr);//设置组地址
inet_pton(AF_INET,"0.0.0.0",&group.imr_address);//本地有效IP
group.imr_ifindex = if_nametoindex("eth0");//给出网卡名,转换为对应编号 setsockopt(sockfd,IPPROTO_IP,IP_MULTICAST_IF,&group,sizeof(group));//组播的权限设置 bzero(&clieaddr,sizeof(clieaddr));
clieaddr.sin_family = AF_INET;
inet_pton(AF_INET,GROUP,&clieaddr.sin_addr.s_addr);
clieaddr.sin_port = htons(CLIENT_PORT); int i = ;
while()
{
sprintf(buf,"服务端组播了 %d次\n",i++);
sendto(sockfd,buf,strlen(buf),,(struct sockaddr*)&clieaddr,sizeof(clieaddr));
sleep();
}
close(sockfd);
return ;
}

client.c

 #include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<strings.h>
#include<string.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<net/if.h> #define SERVER_PORT 8000
#define CLIENT_PORT 9000 #define GROUP "239.0.0.2" int main(int argc,char* argv[])
{
struct sockaddr_in localaddr;
int confd;
ssize_t len;
char buf[BUFSIZ]; struct ip_mreqn group; confd = socket(AF_INET,SOCK_DGRAM,); bzero(&localaddr,sizeof(localaddr));
localaddr.sin_family = AF_INET;
inet_pton(AF_INET,"0.0.0.0",&localaddr.sin_addr.s_addr);
localaddr.sin_port = htons(CLIENT_PORT); bind(confd,(struct sockaddr*)&localaddr,sizeof(localaddr)); inet_pton(AF_INET,GROUP,&group.imr_multiaddr);
inet_pton(AF_INET,"0.0.0.0",&group.imr_address);
group.imr_ifindex = if_nametoindex("eth0"); setsockopt(confd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&group,sizeof(group)); while()
{
len = recvfrom(confd,buf,sizeof(buf),,NULL,);
write(STDOUT_FILENO,buf,len);
}
close(confd);
return ;
}

3.测试结果

  可以看到服务端启动后,客户端可以接收到服务端发送的组播信息

组播的介绍以及CS模型实现的更多相关文章

  1. IP组播技术介绍及实现例子

    引 言 近年来,随着Internet的迅速普及和爆炸性发展,在Internet上产生了许多新的应用,其中不少是高带宽的多媒体应用,譬如网 络视频会议.网络音频/视频广播.AOD/VOD.股市行情发布. ...

  2. IP组播

    1  IP组播基础 IP组播技术有效地解决了单点发送.多点接收的问题.组播源只发送一份数据,被传递的信息在距组播源尽可能远的网络节点才开始被复制和分发,并且只发送给需要该信息的接收者.  说明: 本章 ...

  3. IP组播技术

      1  概述 1.1  产生背景 传统的IP通信有两种方式:一种是在源主机与目的主机之间点对点的通信,即单播:另一种是在源主机与同一网段中所有其它主机之间点对多点的通信,即广播.如果要将信息发送给多 ...

  4. 源特定组播(SSM:Source Specific Multicast)

    源特定组播(SSM:Source Specific Multicast)是一种区别于传统组播的新的业务模型,它使用组播组地址和组播源地址同时来标识一个组播会话,而不是向传统的组播服务那样只使用组播组地 ...

  5. 组播协议——IGMP v2报文头介绍

    TYPE:占一个字节,其值有:0x16.0x12.0x17三种类型. Max Resp Time:最大响应时间,占一个字节. Checksum:校验和,占两个字节. Group address:组播地 ...

  6. MAC地址的介绍(单播、广播、组播、数据收发)

    MAC地址组成 网络设备的MAC地址是全球唯一的.MAC地址长度为48比特,通常用十六进制表示.MAC地址包含两部分:前24比特是组织唯一标识符(OUI,OrganizationallyUniqueI ...

  7. 与众不同 windows phone (33) - Communication(通信)之源特定组播 SSM(Source Specific Multicast)

    原文:与众不同 windows phone (33) - Communication(通信)之源特定组播 SSM(Source Specific Multicast) [索引页][源码下载] 与众不同 ...

  8. 与众不同 windows phone (32) - Communication(通信)之任意源组播 ASM(Any Source Multicast)

    原文:与众不同 windows phone (32) - Communication(通信)之任意源组播 ASM(Any Source Multicast) [索引页][源码下载] 与众不同 wind ...

  9. TCP/IP 笔记 - 广播和本地组播

    在之前第二章介绍IP寻址的时候有介绍到,IP地址有4种:单播.组播.广播.任播. 单播,客户端与服务器之间点到点连接通信: 组播,在发送者和多个接收者(如某个特定的分组)之间实现点对多点的连接通信: ...

随机推荐

  1. axios post传参后台无法接收问题

    起因是在angular项目中使用axios发送post请求,向后台传参后台一直无法接收,网上查了有说是请求头设置不对,需要把Content-Type:application/x-www-form-ur ...

  2. 170313、poi:采用自定义注解的方式导入、导出excel(这种方式比较好扩展)

    步骤一.自定义注解 步骤二.写Excel泛型工具类 步骤三.在需要导出excel的类属相上加上自定义注解,并设置 步骤四.写service,controller 步骤一:自定义注解 import ja ...

  3. Spark 源码分析 -- RDD

    关于RDD, 详细可以参考Spark的论文, 下面看下源码 A Resilient Distributed Dataset (RDD), the basic abstraction in Spark. ...

  4. okhttp发送post请求

    String url = "http://www.xxx.com/api/test"; OkHttpClient httpClient = new OkHttpClient(); ...

  5. python web框架 Django的APP以及目录介绍 2

    app: migrations 数据修改表结构 admin Django为我们提供的后台管理 apps 配置当前app models ORM,写指定的类 通过命令可以创建数据库结构 tests 单元测 ...

  6. 数据分析之可反复与独立样本的T-Test分析

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/jia20003/article/details/24201297 数据分析之独立样本的T-Test分 ...

  7. sql中的连接表达式,视图,事务等。

    给定两张表 表A ),description )); ,'N1','AD1'); ,'N2','AD2'); mysql> SELECT * FROM a; +----+------+----- ...

  8. 从原型链看DOM--Comment,CDATASection,DocumentType,DocumentFragment,Attr类型

    这次总结的是剩下的这些DOM类型节点,可能你见过却不经常使用但是了解一下总是好的,可以加深对DOM体系的整体理解~.本篇要介绍的是Comment,CDATASection,DocumentType,D ...

  9. repo使用

    repo常用指令: 1.repo init(下载repo并克隆manifest) repo init -u URL [OPTIONS] Options: -u:制定一个URL,其连接到一个manife ...

  10. 学习Zookeeper需要了解的专业名词

    一.Zookeeper的集群角色 Leader:该角色是整个zookeeper集群工作机制中的核心 Follower:该角色是zookeeper集群状态的跟随者 Observer:在集群中充当观察者的 ...