单播只能发送给一个接收方,但是当给多个接收者发送时,不仅仅耗费流量,而且耗费时间,总流量=每个接收者的流量*接受者。

广播方式是发送给所有的主机,广播的坏处是会造成信息污染,大量的信息会占用网络带宽。

多播(组播):只有加入某个多播组的主机才能接收到数据。多播既可以发给多个主机,又能避免像广播那样带来的过多的负荷。

组播的地址为D类地址:224.0.1.1-239.255.255.255

那么代码实现如下:

组播发送

 #include <sys/socket.h>
 #include <sys/types.h>
 #include <arpa/inet.h>
 #include <netinet/in.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <errno.h>
 #include <error.h>
 #include <string.h>
 #include <unistd.h>
 #include <time.h>

 #define MCAST_PORT    50001
 #define MCAST_ADDR    "239.0.0.1"

 #define error_exit(_errmsg_)    error(EXIT_FAILURE, errno, _errmsg_)

 #define BUFF_SIZE    1024

 int main()
 {
     int sockfd;
     struct sockaddr_in mcastaddr;
     char *buff = NULL;
     int nbytes;
     time_t time_sec;

     /**创建用户数据包套接字**/
      == (sockfd = socket(AF_INET, SOCK_DGRAM, )))
         error_exit("socket");

     /**指定接收方地址为组播地址**/
     mcastaddr.sin_family = AF_INET;
     mcastaddr.sin_port = htons(MCAST_PORT);
     mcastaddr.sin_addr.s_addr = inet_addr(MCAST_ADDR);

     /**连接到组播地址**/
      == connect(sockfd, (struct sockaddr *)&mcastaddr, sizeof(mcastaddr)))
         error_exit("bind");

     time(&time_sec);
     )  {
         sleep();
         time_sec ++;
         buff = ctime(&time_sec);
         printf("%s", buff);
         /**数据发送**/
          == send(sockfd, buff, strlen(buff), ))
             error_exit("send");
     }
     close(sockfd);

     ;
 }

组播接收,有多个接收者

 #include <stdio.h>
 #include <stdlib.h>
 #include <errno.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <unistd.h>
 #include <string.h>
 #include <strings.h>

 #define N 128

 typedef struct sockaddr SA;

 int main(int argc, const char *argv[])
 {
     int sockfd;

     /**创建用户数据包套接字**/
     )) == -)
     {
         perror("socket");
         exit(-);
     }

     struct sockaddr_in myaddr;
     myaddr.sin_family = AF_INET;
     myaddr.sin_addr.s_addr = inet_addr("239.0.0.1");
     myaddr.sin_port = htons();

     /**绑定多播IP**/
     )
     {
         perror("bind");
         exit(-);
     }

     /*
     ** struct ip_mreq  {
     **     struct in_addr imr_multiaddr;   IP multicast address of group 设置多播组地址
     **     struct in_addr imr_interface;   local IP address of interface  本机IP
     ** };
     */
     /**加入多播组**/
     struct ip_mreq mreq;
     bzero(&mreq, sizeof(mreq));
     mreq.imr_multiaddr.s_addr = inet_addr("239.0.0.1");
     mreq.imr_interface.s_addr = inet_addr(/*"0.0.0.0"*/"192.168.1.24");

     )
     {
         perror("setsockopt");
         exit(-);
     }

     };

     )
     {
         /**等待接收数据**/
         recvfrom(sockfd, buf, N, , NULL, NULL);
         printf("recv : %s\n", buf);
     }

     close(sockfd);
     ;
 }

Linux下实现多播(组播)的更多相关文章

  1. android multicast 多播(组播)问题

    有谁遇到过同样问题的可以探讨下,或者已经解决问题的,能够指导下我    获取组播锁 private  InetAddress   group; WifiManager  wm=(WifiManager ...

  2. IP多播(组播)

    IP多播是实现数据一对多通信的模式.从一个源点传送到多个目的地,数据仅仅拷贝一份.这里说的数据仅仅拷贝一份,是指在每一条须要它的两个点之间,数据仅仅有一份.例如以下图为<计算机网络>(谢希 ...

  3. Java单播、广播、多播(组播)---转

    一.通信方式分类 在当前的网络通信中有三种通信模式:单播.广播和多播(组播),其中多播出现时间最晚,同时具备单播和广播的优点. 单播:单台主机与单台主机之间的通信 广播:当台主机与网络中的所有主机通信 ...

  4. Java单播、广播、多播(组播)

    一.通信方式分类 在当前的网络通信中有三种通信模式:单播.广播和多播(组播),其中多播出现时间最晚,同时具备单播和广播的优点. 单播:单台主机与单台主机之间的通信 广播:当台主机与网络中的所有主机通信 ...

  5. 多网卡情况下接收udp组播

    多网卡下接收udp组播 往往会接收失败 因为用错了网卡 例如我想要接收2网段 其他电脑出的udp组播  我电脑有有线网和wifi在window下可以这样 route add 230.0.0.1 mas ...

  6. Linux IPC socket 广播,组播

    getsockopt()/setsockopt() //获得sockfd指向的socket的属性 int getsockopt(int sockfd, int level, int optname, ...

  7. Linux下用户和组管理

    用户与组之间的关系是,组下面有若干个用户,每个用户必须从属于唯一一个组.组可以理解为权限的集合.用户管理的命令有:useradd, userdel, usermod, passwd, chsh, ch ...

  8. 2017.7.18 linux下用户、组和文件的操作

    参考来自:<鸟叔的linux私房菜(基础学习篇)-第14章> 0 目的 在linux下搭建ELK环境时,因为elasticsearch不能在root下操作,所以要为其新增一个用户,以及随之 ...

  9. 【miscellaneous】多播(组播)原理分析

    为什么要使用多播:        网卡从网络上接收到目标物理地址对应的所有bit位都为1的数据报时,会收到这条消息并将其上传给驱动程序,网卡的这种工作模式称为广播模式,网卡的缺省工作模式包含直接模式和 ...

随机推荐

  1. 洛谷 P2022 有趣的数 解题报告

    P2022 有趣的数 题目描述 让我们来考虑1到N的正整数集合.让我们把集合中的元素按照字典序排列,例如当N=11时,其顺序应该为:1,10,11,2,3,4,5,6,7,8,9. 定义K在N个数中的 ...

  2. gitlab相关

    1.gitlab的概述 1.gitlab是什么 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务. 基础功能免费,高级功能收费 2.为什么要使用gitla ...

  3. MVC3控制器方法获取Form数据方法

    http://www.cnblogs.com/bianlan/archive/2013/01/12/2857310.html 控制器方法获取View页面传送的数据有多种方法,以Edit方法为例: 1. ...

  4. 关于ASP.NET MVC的Html.BeginForm()方法

    http://zhidao.baidu.com/link?url=9j53URZJv2B9W-TPtQAaKCRbqIcYy2r3WNO0NDzciTON0EYj5Hhd3rl3UlIllK1CqOC ...

  5. Java入门:基础算法之检查奇偶性

    本程序检查一个数是奇数还是偶数. import java.util.Scanner; class CheckEvenOdd { public static void main(String args[ ...

  6. Hadoop部署方式-本地模式(Local (Standalone) Mode)

    Hadoop部署方式-本地模式(Local (Standalone) Mode) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Hadoop总共有三种运行方式.本地模式(Local ...

  7. pandas基础整理

    用jupyter写好,直接放到GitHub上面了→_→ 博客链接:https://douzujun.github.io/page/%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%9 ...

  8. Jekins - Hello world,Jekins + Maven + Git + Tomcat 的简单应用

    Java Web 工程 新建一个简单的 Java Web 工程,并提交至 GitHub,可参考 Eclipse 提交工程至 GitHub 下载 jekins.war 在 http://mirrors. ...

  9. 为什么C++空类的实例大小为1

    [为什么C++空类的实例大小为1] 每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址.所以大小为1. 参考 ...

  10. 读懂复杂C声明的黄金法则

    在网上遇见felix,他让我读 http://www.felix021.com/blog/read.php?2072,读完之后觉得收获很大,需要练习一下. 黄金法则:从声明的变量开始,先向右看,再向左 ...