linux 多播
1.概念
单播是用于两个主机之间传送数据,广播是一个主机对局域网内的所有主机发送数据。而多播,又称为组播,它是对一组特定的主机通信。将网络上同一类型 业务逻辑上分组,只和组内的成员通信,其它主机没有加入组则不能通信。与单播相同的是,组播允许在Internet上通信,而广播只是同一局域网内的主机 通信。组播地址是特定的,D类地址用于组播,即244.0.0.0到239.255.255.255. 并划分为局部连接多播地址,预留多播地址和管理权限多播地址3类。
2. 多播套接字设置
可用setsockopt或getsockopt设置或得到多播选项. 常用的多播选项如下所示:
IP_MULTICAST_TTL 设置多播的TTL值
IP_MULTICAST_IF 获取或设置多播接口
IP_MULTICAST_LOOP 禁止多播数据回送到本地loop接口
IP_ADD_MEMBERSHIP 将指定的接口加入多播
IP_DROP_MEMBERSHIP 退出多播组
struct ip_mreq{
struct in_addr imn_multicastaddr;//多播组地址
struct in_addr imr_interface;//加入的接口的IP地址
}
/*PROTO_IP-选项所在的协议层
*IP_MULTICAST_TTL-选项名
*&ttl-设置的内存缓冲区
*sizeof(ttl)-设置的内存缓冲区长度*/
int ttl=255;
setsockopt(s,IPPROTO_IP,IP_MULTICAST_TTL,&ttl,sizeof(ttl));//设置跳数
struct in_addr in;
setsockopt(s,IPPROTO_IP,IP_MUTLICAST_IF,&in,sizeof(in));//设置组播接口
int yes=1;
setsockopt(s,IPPROTO_IP,IP_MULTICAST_LOOP,&yes,sizeof(yes));//设置数据回送到本地回环接口
struct ip_mreq addreq;
setsockopt(s,IPPROTO_IP,IP_ADD_MEMBERSHIP,&req,sizeof(req));//加入组播组
struct ip_mreq dropreq;
setsockopt(s,IPPROTO_IP,IP_DROP_MEMBERSHIP,&dropreq,sizeof(dropreq));//离开组播组
3. 多播程序的设计流程
(1)建立socket
(2)设置TTL值 IP_MULTICAST_TTL
(3)设置是否允许本地回环 IP_MULTICAST_LOOP
(4)加入多播组 IP_ADD_MEMBERSHIP
(5)发送数据 send
(6)接收数据 recv
(7)退出多播组 IP_DROP_MEMBERSHIP
4、多播服务器端
//服务器实现向多播组发送数据
#define MCAST_PORT 8888
#define MCAST_ADDR "224.0.0.88"
int main(int argc,char*argv[]){
int ret;
int s;
int i=;
struct sockaddr_in Multi_addr;//多播地址
struct sockaddr_in client_addr;
s=socket(AF_INET,SOCK_DGRAM,);//建立数据报套接字
if(s<){
perror("socket error");
return -;
}
Multi_addr.sin_family=AF_INET;
Multi_addr.sin_port=htons(MCAST_PORT);//多播端口
Multi_addr.sin_addr.s_addr=inet_addr(MCAST_ADDR);//多播地址
//向多播组发送数据
char buffer[];
for(;;){
memset(buffer,,sizeof(buffer));
sprintf(buffer,"%d",i);
int size=sendto(s,buffer,strlen(buffer),,(struct sockaddr*)&Multi_addr,sizeof(Multi_addr));
if(size<){
perror("sendto error");
}
sleep();
i++;
memset(buffer,,sizeof(buffer));
int len=sizeof(client_addr);
size=recvfrom(s,buffer,,,(struct sockaddr*)&client_addr,&len);
write(,buffer,size);
}
close(s);
}
5、客户端代码
加入多播组的主机:
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
//多播的客户端程序
#define PORT 8888
#define MCAST "224.0.0.88"
int main(int argc,char*argv[]){
int s;
int ret;
int size;
int ttl=;//如果转发的次数等于10,则不再转发
int loop=;
int times=;
char buffer[];
struct sockaddr_in localaddr,fromaddr;//多播地址结构
//建立套接字
s=socket(AF_INET,SOCK_DGRAM,);
if(s<){
perror("socket error");
return -;
}
//多播的地址结构
localaddr.sin_family=AF_INET;
localaddr.sin_port=htons(PORT);//多播端口号
localaddr.sin_addr.s_addr=htonl(INADDR_ANY);//接收任意地址发送的数据
//绑定地址结构到套接字
ret=bind(s,(struct sockaddr*)&localaddr,sizeof(localaddr));//客户端需要绑定端口,用来接收服务器的数据,得指定接收端口,因为数据先从服务器发送过来的
if(ret<){
perror("bind error");
return -;
}
//设置多播的TTL值
if(setsockopt(s,IPPROTO_IP,IP_MULTICAST_TTL,&ttl,sizeof(ttl))<){
perror("IP_MULTICAST_TTL");
return -;
} //设置数据是否发送到本地回环接口
if(setsockopt(s,IPPROTO_IP,IP_MULTICAST_LOOP,&loop,sizeof(loop))<){
perror("IP_MULTICAST_LOOP");
return -;
}
//客户端加入多播组
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr=inet_addr(MCAST);//多播组的IP
mreq.imr_interface.s_addr=htonl(INADDR_ANY);//本机的默认接口IP
if(setsockopt(s,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq))<){
perror("IP_ADD_MEMBERSHIP");
return -;
}
//循环接收多播组的消息,5次退出
for(times=;times<;times++){
int len=sizeof(fromaddr);
memset(buffer,,sizeof(buffer));
size=recvfrom(s,buffer,,,(struct sockaddr*)&fromaddr,&len);
if(size<){
perror("recvfrom ");
return -;
}
printf("receive message:%s\n",buffer);
printf("Port is:%d\n",fromaddr.sin_port);
size=sendto(s,"OK",,,(struct sockaddr*)&fromaddr,sizeof(fromaddr));//向服务器发送数据,向服务器指定的IP与端口发送数据
} //离开多播组
ret=setsockopt(s,IPPROTO_IP,IP_DROP_MEMBERSHIP,&mreq,sizeof(mreq));
if(ret<){
perror("IP_DROP_MEMBERSHIP");
return -;
}
close(s);
return ; }
linux 多播的更多相关文章
- Linux网络编程--多播
一.多播介绍 什么是多播? 单播用于两个主机之间的端对端通信,广播用于一个主机对整个局域网上所有主机上的数据通信.单播和广播是两个极端,要么对一个主机进行通信,要么对整个局域网上的主机进行通信.实际情 ...
- linux网络编程之一-----多播(组播)编程
什么是多播 组播(Multicast)是网络一种点对多(one to many)的通信方式,通过报文复制完成网络中一台server对应多台接收者的高效数据传 送.对其形象的比喻就是类似于广播电台和电视 ...
- suse linux 命令
1.修改vftpd配置文件 vi /etc/vsftpd .conf #listen=YES vi /etc/xinetd.d/vsftpd ...
- Linux 驱动开发
linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...
- linux网络编程之二-----多播(组播)编程
多播编程实例 服务器端 下面是一个多播服务器的例子.多播服务器的程序设计很简单,建立一个数据包套接字,选定多播的IP地址和端口,直接向此多播地址发送数据就可以了.多播服务器的程序设计,不需要服务器加入 ...
- Linux下实现多播(组播)
单播只能发送给一个接收方,但是当给多个接收者发送时,不仅仅耗费流量,而且耗费时间,总流量=每个接收者的流量*接受者. 广播方式是发送给所有的主机,广播的坏处是会造成信息污染,大量的信息会占用网络带宽. ...
- c++ 网络编程(六)LINUX下 socket编程 多播与广播 实现一次发送所有组客户端都能接收到
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9614288.html 一.多播 锲子:有这么一种情况,网络电台可能需要同时向成千上万的用户传输 ...
- linux 网卡接收多播MAC(01:08开头)
调用: int dev_set_allmulti(struct net_device *dev, int inc) 打上IFF_ALLMULTI标记 #define IFF_ALLMULTI ...
- linux 加多播协议(IGMP)
可能你所用的内核编译时没有选中multicast的选项. 追问 感谢您的回复,但是我还是不太明白你说的multicast选项是什么意思.能更详细的说一下吗,谢谢.或者能直接用QQ或者MSN帮忙看看 ...
随机推荐
- HTML5开发,背后的事情你知道吗?
现在的H5越来越受到企业或者是开发者的一个大力的追捧,已经成为网络推广必不可少的一个使用的工具,相信还有很多朋友现在都不知道H5是个什么东西,本文将为大家讲的是关于H5一些分类的问题,让你进一步的去学 ...
- 利用批处理结合Msbuild实现快速编译
我们经常在用vs2005做项目的时候会把一个项目分成几个模块(不管是对于功能上,还是系统构架上面),为的是以后部署,还有修改维护时候的方便.这样就会带来一个问题,随着模块的增加(这里所说得每个模块就是 ...
- 并查集,是否成树,Poj(1308)
思路: 对于每一条新的边的两个端点,是否是属于一颗树,要是的话,就不是一颗树.否则,就合并. 这里要注意的是,不能是森林,我这里WA了两次了.只不过在最后,查看每个节点的祖先是否是同一个就可以了. # ...
- CentOS 6下PXE+Kickstart无人值守安装操作系统
一.简介1.1 什么是PXEPXE(Pre-boot Execution Environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作 ...
- this指针和类的继承
神秘的家伙 在对象的世界里,有一个特殊的指针,它叫做this.我们从来没有见过他,但是他却从来都存在.我们通过一个典型的例子来认识它: class Human { char fishc; Human( ...
- Nginx + uWSGI + web.py 搭建示例
(1)安装Nginx1.1 下载nginx-1.0.5.tar.gz并解压1.2 ./configure (也可以增加--prefix= path指定安装路径)此时有可能会提示缺少pcre支持,如果要 ...
- AngularJS 控制器的方法
AngularJS 控制器也有方法(变量和函数) <!DOCTYPE html><html><head><meta http-equiv="Cont ...
- leetcode第221题(最大正方形)的本地IDE实现及变形
问题描述: 在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积.PS:本文也对只包含0的最大正方形面积进行了运算 示例: 输入: 1 0 1 0 0 1 0 1 1 1 ...
- DCMTK读取DICOM文件头信息的三种方法
Howto: Load File Meta-Header Here's an example that shows how to load the File Meta Information Head ...
- kafka单机环境搭建及其基本使用
最近在搞kettle整合kafka producer插件,于是自己搭建了一套单机的kafka环境,以便用于测试.现整理如下的笔记,发上来和大家分享.后续还会有kafka的研究笔记,依然会与大家分享! ...