多播/组播

多播数据同时传递到加入特定组的大量主机

多播地址D类地址:224.0.0.0~239.255.255.255

数据的发送者和接收者
发送者:只要往多播组地址发送数据
接收者:需要加入到多播组
通过如下代码加入多播组:
/*
struct ip_mreq
{
/* 多播组地址 */
struct in_addr imr_multiaddr;

/* 加入多播组的主机地址 */
struct in_addr imr_interface;
};
*/
struct ip_mreq join_addr;
join_addr.imr_multiaddr.s_addr = inet_addr("224.1.2.3");
join_addr.imr_interface.s_addr = htonl(INADDR_ANY);//inet_addr("192.168.1.xxx");

setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,(void*)&join_addr,sizeof(join_addr));

struct sockaddr_in addr;
addr.sin_port = htons(8888);
addr.sin_addr.s_addr = inet_addr("224.1.2.3");
bind(sockfd,(struct sockaddr*)&addr,sizeof(addr));

---------------------在开发板上运行如下命令以支持多播-----------------------------
route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0

代码

发送端

#include<stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<string.h>
#include<sys/select.h>
int main(int argc,char **argv)
{
if(argc < 3)
{
printf("Usage:%s <multiAddr> <port>\n",argv[0]);
return -1;
}
//1.创建socket
int sockfd = socket(AF_INET,SOCK_DGRAM,0);
if(sockfd < 0)
{

perror("socket");
return -1;
}
//设置使能发送广播数据报
int i = 1;
setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,(void*)&i,sizeof(int));

//2.准备通信地址
struct sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(atoi(argv[2]));
serverAddr.sin_addr.s_addr = inet_addr(argv[1]);

//4.通信
while(1)
{
char *str = "hello udp server";
int r = sendto(sockfd,str,strlen(str),0,(struct sockaddr*)&serverAddr,sizeof(serverAddr));
// printf("r = %d\n",r);
sleep(1);
}
//5.关闭
close(sockfd);
printf("Hello World!\n");
return 0;
}

接收端

#include<stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<string.h>
#include<sys/select.h>
int main(int argc,char **argv)
{
if(argc < 3)
{
printf("Usage:%s <multiaddr> <Port>\n",argv[0]);
return -1;
}
//1.创建socket
int sockfd = socket(AF_INET,SOCK_DGRAM,0);
if(sockfd < 0)
{

perror("socket");
return -1;
}
struct ip_mreq join_addr;
join_addr.imr_multiaddr.s_addr = inet_addr(argv[1]);
join_addr.imr_interface.s_addr = htonl(INADDR_ANY);

setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,(void*)&join_addr,sizeof(join_addr));

//2.准备通信地址
struct sockaddr_in serverAddr;
memset(&serverAddr,0,sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(atoi(argv[2]));
// serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
serverAddr.sin_addr.s_addr = inet_addr(argv[1]);
//3.绑定
int res = bind(sockfd,(struct sockaddr*)&serverAddr,sizeof(serverAddr));
if(res < 0)
{
perror("bind");
return -1;
}
printf("绑定成功~~\n");

//4.通信
while(1)
{
char buf[1024] = {0};
recvfrom(sockfd,buf,sizeof(buf),0,NULL,NULL);
printf("recv data:%s\n",buf);
}
//5.关闭
close(sockfd);
printf("Hello World!\n");
return 0;
}

时间: 2024-10-05 05:06:59

多播/组播的相关文章

IP多播(组播)

IP多播是实现数据一对多通信的模式.从一个源点传送到多个目的地,数据仅仅拷贝一份.这里说的数据仅仅拷贝一份,是指在每一条须要它的两个点之间,数据仅仅有一份.例如以下图为<计算机网络>(谢希仁)第五版中单播与多播示意图. 因特网上的多播成为IP多播. 多播组 实现多播,必定就须要有多播组.多播组须要有自己的标识符.而多播组IP即为多播组的标识符,一个多播组IP代表一个多播组. D类IP地址即为多播组IP地址.D类地址前四位为1110,范围是 224.0 .0 .0到 239. 255. 255.

单播、多播(组播)和广播的区别

单播.多播和广播单播"(Unicast)."多播"(Multicast)和"广播"(Broadcast)这三个术语都是用来描述网络节点之间通讯方式的术语.那么这些术语究竟是什么意思?区别何在? 1.单播:网络节点之间的通信就好像是人们之间的对话一样.如果一个人对另外一个人说话,那么用网络技术的术语来描述就是"单播",此时信息的接收和传递只在两个节点之间进行.单播在网络中得到了广泛的应用,网络上绝大部分的数据都是以单播的形式传输的,只是一

Android开发:组播(多播)与广播

近期由于需要编写能够使同一局域网中的Android客户端与PC端进行自动匹配通信功能的程序,学习并试验了JAVA组播与广播的内容,记录一些理解如下: 一.组播(多播)背景知识:组播使用UDP对一定范围内的地址发送相同的一组Packet,即一次可以向多个接受者发出信息,其与单播的主要区别是地址的形式.IP协议分配了一定范围的地址空间给多播(多播只能使用这个范围内的IP),IPv4中组播地址范围为224.0.0.0到239.255.255.255.JAVA编程:java中通过MulticastSoc

十五、MDT 2013 Update 1批量部署-利用微软WDS部署服务实现MDT部署组播(多播)

MDT 2013 Update 1在客户端部署会占用不少带宽,利用微软的WDS部署服务,可以实现部署组播,在多个客户端部署时可以有效的节省网络带宽,同时提供多个客户端的部署速度. 一.WDS部署服务 其实只要默认值 查看多播传输,里面没配置多播传输 二.MDT 2013 UPDATE 1控制台下配置组播(多播) 修改对应的共享文件夹属性 选取 "Enable multicast for this deployment share",下面有说明需要WDS支持,不过为啥微软不标明也可以支持

单播,组播(多播),广播以及任播

目录 [+] 单播(unicast): 是指封包在计算机网络的传输中,目的地址为单一目标的一种传输方式.它是现今网络应用最为广泛,通常所使用的网络协议或服务大多采用单播传输,例如一切基于TCP的协议.组播(multicast): 也叫多播, 多点广播或群播. 指把信息同时传递给一组目的地址.它使用策略是最高效的,因为消息在每条网络链路上只需传递一次,而且只有在链路分叉的时候,消息才会被复制.广播(broadcast):是指封包在计算机网络中传输时,目的地址为网络中所有设备的一种传输方式.实际上,

单播、多播(组播)和广播的差别

单播.多播和广播单播"(Unicast)."多播"(Multicast)和"广播"(Broadcast)这三个术语都是用来描写叙述网络节点之间通讯方式的术语. 那么这些术语到底是什么意思?差别何在? 1.单播:网络节点之间的通信就好像是人们之间的对话一样. 假设一个人对另外一个人说话.那么用网络技术的术语来描写叙述就是"单播".此时信息的接收和传递仅仅在两个节点之间进行.单播在网络中得到了广泛的应用.网络上绝大部分的数据都是以单播的形式

单播、多播(组播)和广播的区别,搞通信选整明白这三个东东

单播.多播和广播单播”(Unicast).“多播”(Multicast)和“广播”(Broadcast)这三个术语都是用来描述网络节点之间通讯方式的术语.那么这些术语究竟是什么意思?区别何在? 1.单播: 网络节点之间的通信就好像是人们之间的对话一样.如果一个人对另外一个人说话,那么用网络技术的术语来描述就是“单播”,此时信息的接收和传递只在两个节点之间进行.单播在网络中得到了广泛的应用,网络上绝大部分的数据都是以单播的形式传输的,只是一般网络用户不知道而已.例如,你在收发电子邮件.浏览网页时,

Linux下实现多播(组播)

单播只能发送给一个接收方,但是当给多个接收者发送时,不仅仅耗费流量,而且耗费时间,总流量=每个接收者的流量*接受者. 广播方式是发送给所有的主机,广播的坏处是会造成信息污染,大量的信息会占用网络带宽. 多播(组播):只有加入某个多播组的主机才能接收到数据.多播既可以发给多个主机,又能避免像广播那样带来的过多的负荷. 组播的地址为D类地址:224.0.1.1-239.255.255.255 那么代码实现如下: 组播发送 1 #include <sys/socket.h> 2 #include &

JAVA 单播、多播(组播)、广播

单播"(Unicast)."多播"(Multicast)和"广播"(Broadcast)这三个术语都是用来描述网络节点之间通讯方式的术语.那么这些术语究竟是什么意思?区别何在? 1. 单播:网络节点之间的通信就好像是人们之间的对话一样.如果一个人对另外一个人说话,那么用网络技术的术语来描述就是"单播",此时信息的接收和传递只在两个节点之间进行.单播在网络中得到了广泛的应用,网络上绝大部分的数据都是以单播的形式传输的,只是一般网络用户不知