组播的介绍以及CS模型实现
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模型实现的更多相关文章
- IP组播技术介绍及实现例子
引 言 近年来,随着Internet的迅速普及和爆炸性发展,在Internet上产生了许多新的应用,其中不少是高带宽的多媒体应用,譬如网 络视频会议.网络音频/视频广播.AOD/VOD.股市行情发布. ...
- IP组播
1 IP组播基础 IP组播技术有效地解决了单点发送.多点接收的问题.组播源只发送一份数据,被传递的信息在距组播源尽可能远的网络节点才开始被复制和分发,并且只发送给需要该信息的接收者. 说明: 本章 ...
- IP组播技术
1 概述 1.1 产生背景 传统的IP通信有两种方式:一种是在源主机与目的主机之间点对点的通信,即单播:另一种是在源主机与同一网段中所有其它主机之间点对多点的通信,即广播.如果要将信息发送给多 ...
- 源特定组播(SSM:Source Specific Multicast)
源特定组播(SSM:Source Specific Multicast)是一种区别于传统组播的新的业务模型,它使用组播组地址和组播源地址同时来标识一个组播会话,而不是向传统的组播服务那样只使用组播组地 ...
- 组播协议——IGMP v2报文头介绍
TYPE:占一个字节,其值有:0x16.0x12.0x17三种类型. Max Resp Time:最大响应时间,占一个字节. Checksum:校验和,占两个字节. Group address:组播地 ...
- MAC地址的介绍(单播、广播、组播、数据收发)
MAC地址组成 网络设备的MAC地址是全球唯一的.MAC地址长度为48比特,通常用十六进制表示.MAC地址包含两部分:前24比特是组织唯一标识符(OUI,OrganizationallyUniqueI ...
- 与众不同 windows phone (33) - Communication(通信)之源特定组播 SSM(Source Specific Multicast)
原文:与众不同 windows phone (33) - Communication(通信)之源特定组播 SSM(Source Specific Multicast) [索引页][源码下载] 与众不同 ...
- 与众不同 windows phone (32) - Communication(通信)之任意源组播 ASM(Any Source Multicast)
原文:与众不同 windows phone (32) - Communication(通信)之任意源组播 ASM(Any Source Multicast) [索引页][源码下载] 与众不同 wind ...
- TCP/IP 笔记 - 广播和本地组播
在之前第二章介绍IP寻址的时候有介绍到,IP地址有4种:单播.组播.广播.任播. 单播,客户端与服务器之间点到点连接通信: 组播,在发送者和多个接收者(如某个特定的分组)之间实现点对多点的连接通信: ...
随机推荐
- js i++ 与 ++i 的区别
转载:http://blog.csdn.net/hjb2722404/article/details/50423804 在javascript中,我们常常搞不懂i++与++i的区别,今天我们就来简单说 ...
- -bash: xxx: /bin/sh^M: bad interpreter: No such file or directory
原因是shell脚本文件的文件格式错误 通过vi编辑器来查看文件的format格式.步骤如下: 1.首先用vi命令打开文件 vi stop.sh 2.在vi命令模式中使用 :set ff 命令 可以看 ...
- cocoapod 最新安装使用步骤
cocoapod 最新安装使用步骤 安装 1.sudo gem update (2个-)system :更新你的gem system至最新 2.gem sources (2个-)remove htt ...
- 借助 Django 的 smart_str 和 smart_unicode 进行编码转换(转)
原文:http://www.dirk.sh/diary/using-django-smart_str-smart_unicode/ Django 为字符编码的转换提供了非常简洁的方法: 1.djang ...
- python模块之PIL模块(生成随机验证码图片)
PIL简介 什么是PIL PIL:是Python Image Library的缩写,图像处理的模块.主要的类包括Image,ImageFont,ImageDraw,ImageFilter PIL的导入 ...
- Flask系列(十一)整合Flask中的目录结构(sqlalchemy-utils)
一.SQLAlchemy-Utils 由于sqlalchemy中没有提供choice方法,所以借助SQLAlchemy-Utils组件提供的choice方法 import datetime from ...
- Spring第六弹—-依赖注入之使用构造器注入与使用属性setter方法注入
所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中. 使用构造器注入 1 2 3 4 <constructor-arg index=“0” type=“java.lang. ...
- RF是如何工作的?
随机森林的发展史 谈及随机森林算法的产生与发展,我们必须回溯到20世纪80年代.可以说,该算法是Leo Breiman, Adele Cutler, Ho Tin Kam, Dietterich, A ...
- django 【认证】
一.验证 1.views.py from django.contrib.auth.decorators import login_required from django.contrib.auth i ...
- MySQL,sqlalchemy
Mariadb 数据库是一堆表的集合 主键 外键 索引 安装: Centos7 [root@host]# mysqladmin -u root password "new_password& ...