广播

广播:在一个局域网内部,所有的终端都能够收到数据包。使用广播的发送数据,会使处于同一个局域网内部的所有用户都必须接收到数据,用户不能拒绝。
注意:在使用广播和组播时,发送方和接收方都要处于同一个局域网内。因为广播和组播只能在一个局域网内部发送数据。广播和组播与一般网络通信有所不同,网络通信传输的是数据包;广播传输的数据叫广播包,组播传输的数据叫组播包。
原理: 发送方发送广播包到交换机/路由器,交换机识别到是一个广播包, 于是由交换机转发N份到局域网中的每一个终端。ip 地址=网络号 +主机号,主机号全部为1的ip地址称为广播地址。发送方将ip包的目的地址改为广播地址,路由器收到数据包发现其目的地址是广播地址,于是就将广播包转发给局域网内部的每一台电脑。
在广播中,只有发送端(send)和接收端(receive)一律使用udp协议传送数据。
编写广播程序的步骤:

  1. 设置允许发送;
  2. 将目的地址改为广播地址;
  3. 端口号和接收方一致。

广播的缺点: 如果有大量广播包存在于交换机/路由器中会造成网络风暴,因为交换机要将一个广播包发给局域网下的每一个终端,如果有大量广播包拥塞在网络中,就会造成网络延迟大、卡顿、网速慢等问题。所以为了解决这一问题,有了组播的产生。
广播只需要发送端进行相关设定后就可以向局域网其他终端发送数据包,其他的终端只需要打开接收数据的程序即可。

例、发送一个广播包到局域网内的其他终端上。
头文件com.h

#ifndef UDP_STRUCT_TEST_H
#define UDP_STRUCT_TEST_H
#define PORT 5549
struct mesdata
{int temp;int hum;short cnt;char des[64];
}__attribute__((packed));
#endif

发送程序send.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <string.h>#include "com.h"int main(void)
{int sock_cli;struct sockaddr_in cliaddr;int res;int recv;struct mesdata clidata;socklen_t clilen;int enable = 1;sock_cli = socket(AF_INET,SOCK_DGRAM,0);if(sock_cli < 0){perror("socket()");exit(-1);}//允许发送广播数据setsockopt(sock_cli,SOL_SOCKET,SO_BROADCAST,&enable,sizeof(enable));cliaddr.sin_family = AF_INET;cliaddr.sin_port = PORT;cliaddr.sin_addr.s_addr = inet_addr("192.168.3.255");clidata.temp = 28;clidata.hum = 64;clidata.cnt = 0;strcpy(clidata.des,"the imformation is");while(1){clidata.temp = htonl(clidata.temp);clidata.hum = htonl(clidata.hum);clidata.cnt = htons(clidata.cnt);res = sendto(sock_cli,&clidata,sizeof(clidata),0,\(struct sockaddr *)&cliaddr,sizeof(cliaddr));if(res < 0){perror("sendto()");exit(-5);}clidata.cnt = ntohs(clidata.cnt);clidata.cnt++;clidata.temp = ntohl(clidata.temp);clidata.hum = ntohl(clidata.hum);sleep(1);}close(sock_cli);exit(0);
}

接收端程序recv.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <string.h>#include "com.h"int main(void)
{int sock_serv;struct sockaddr_in servaddr;int res;struct mesdata data;struct sockaddr_in cliaddr;int recv;socklen_t clilen;int enable = 1;sock_serv = socket(AF_INET,SOCK_DGRAM,0);if(sock_serv < 0){perror("socket()");exit(-1);}setsockopt(sock_serv,SOL_SOCKET,SO_REUSEADDR,&enable,sizeof(enable));servaddr.sin_family = AF_INET;servaddr.sin_port = PORT;servaddr.sin_addr.s_addr = INADDR_ANY;res = bind(sock_serv,(struct sockaddr *)&servaddr,sizeof(servaddr));if(res < 0){perror("bind()");exit(-2);}while(1){clilen = sizeof(cliaddr);memset(&data,0,sizeof(data));recv = recvfrom(sock_serv,&data,sizeof(data),0,\(struct sockaddr *)&cliaddr,&clilen);if(recv < 0){perror("recvfrom()");exit(-3);}else if(recv == 0){printf("closeed!\n");exit(0);}data.cnt = ntohs(data.cnt);data.temp = ntohl(data.temp);data.hum = ntohl(data.hum);printf("[%d] %s temp=%d,hum=%d\n",\data.cnt,data.des,data.temp,data.hum);}close(sock_serv);exit(0);
}

组播

组播:在路由器中建立一个分组,感兴趣的成员加入该组,往改组发送组播包, 路由器识别到组播包,就转发给组内的每一个成员。
通过组播ip识别每一个分组。将数据包的目的ip改为该分组的ip地址,就可以将数据包发送给该组内成员。

例、发送一个组播包到局域网中的一个组。
头文件com.h

#ifndef UDP_STRUCT_TEST_H
#define UDP_STRUCT_TEST_H
#define PORT 5549
struct mesdata
{int temp;int hum;short cnt;char des[64];
}__attribute__((packed));
#endif

发送端程序send.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <string.h>#include "com.h"int main(void)
{int sock_cli;struct sockaddr_in cliaddr;int res;int recv;struct mesdata clidata;socklen_t clilen;int enable = 1;sock_cli = socket(AF_INET,SOCK_DGRAM,0);if(sock_cli < 0){perror("socket()");exit(-1);}cliaddr.sin_family = AF_INET;cliaddr.sin_port = PORT;cliaddr.sin_addr.s_addr = inet_addr("239.7.21.12");//改为组播地址clidata.temp = 28;clidata.hum = 64;clidata.cnt = 0;strcpy(clidata.des,"the imformation is");while(1){clidata.temp = htonl(clidata.temp);clidata.hum = htonl(clidata.hum);clidata.cnt = htons(clidata.cnt);res = sendto(sock_cli,&clidata,sizeof(clidata),0,\(struct sockaddr *)&cliaddr,sizeof(cliaddr));if(res < 0){perror("sendto()");exit(-5);}clidata.cnt = ntohs(clidata.cnt);clidata.cnt++;clidata.temp = ntohl(clidata.temp);clidata.hum = ntohl(clidata.hum);sleep(1);}close(sock_cli);exit(0);
}

接收端程序recv.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <string.h>#include "com.h"int main(void)
{int sock_serv;struct sockaddr_in servaddr;int res;struct mesdata data;struct sockaddr_in cliaddr;int recv;socklen_t clilen;int enable = 1;struct ip_mreqn  multi_castaddr;sock_serv = socket(AF_INET,SOCK_DGRAM,0);if(sock_serv < 0){perror("socket()");exit(-1);}/*允许重用IP地址和端口号*/setsockopt(sock_serv,SOL_SOCKET,SO_REUSEADDR,&enable,sizeof(enable));servaddr.sin_family = AF_INET;servaddr.sin_port = PORT;servaddr.sin_addr.s_addr = INADDR_ANY;res = bind(sock_serv,(struct sockaddr *)&servaddr,sizeof(servaddr));if(res < 0){perror("bind()");exit(-2);}multi_castaddr.imr_multiaddr.s_addr = inet_addr("239.7.21.12");//要加入的组播地址multi_castaddr.imr_address.s_addr = INADDR_ANY;//本机IP地址multi_castaddr.imr_ifindex = 0;//网卡号,ifconfig命令显示的eth0就是网卡号setsockopt(sock_serv,IPPROTO_IP,IP_ADD_MEMBERSHIP,\&multi_castaddr,sizeof(multi_castaddr));//加入组播while(1){clilen = sizeof(cliaddr);memset(&data,0,sizeof(data));recv = recvfrom(sock_serv,&data,sizeof(data),0,\(struct sockaddr *)&cliaddr,&clilen);if(recv < 0){perror("recvfrom()");exit(-3);}else if(recv == 0){printf("closeed!\n");exit(0);}data.cnt = ntohs(data.cnt);data.temp = ntohl(data.temp);data.hum = ntohl(data.hum);printf("[%d] %s temp=%d,hum=%d\n",\data.cnt,data.des,data.temp,data.hum);}close(sock_serv);exit(0);
}

Linux系统的广播和组播相关推荐

  1. linux UDP实现广播和组播

    广播 广播很简单,原理不解释了,这里实现的重点在于: 1.对服务器端的套接字使用setsockopt函数开放广播权限 2.指定要发送的IP(广播地址)+端口号 3.客户端必须显式绑定端口号(和2的端口 ...

  2. linux配组播ip地址,linux 广播和组播

    广播和组播 广播,必须使用UDP协议,是只能在局域网内使用,指定接收端的IP为*.*.*.255后,发送的信息,局域网内的所有接受端就能够接到信息了. 广播的发送端代码 #include #inclu ...

  3. Linux环境下服务器利用组播来获取客户端IP

    Linux环境下服务器利用组播来获取客户端IP 单播是两个主机之间端对端通信(比如TCP.UDP通信),而广播用于一个主机对整个局域网中所有主机的通信.单播和广播是两个极端,要么对一个主机通信,要么对 ...

  4. 网络编程-Socket套接字(TCP、UDP、广播和组播通信)

    socket套接字 socket是一个编程接口(网络编程接口) 作用是用来实现网络上不同的主机的应用进程之间进行双向通信 套接字是一种特殊的文件描述符 也就意味着我们使用套接字实现网络通信的时候可以用 ...

  5. 单播、广播、组播详解

    组播协议允许将一台主机发送的数据通过网络路由器和交换机复制到多个加入此组播的主机,是一种一对多的通讯方式. IP组播的好处.优势 组播协议与现在广泛使用的单播协议的不同之处在于,一个主机用单播协议向n ...

  6. 计算机网络 | 广播与组播

    欢迎关注博主 Mindtechnist 或加入[Linux C/C++/Python社区]一起学习和分享Linux.C.C++.Python.Matlab,机器人运动控制.多机器人协作,智能优化算法, ...

  7. 网络编程 广播、组播

    目录 一.UDP 1. 流程 2. 相关函数 二.广播 1.概念 2. 流程 三.组播 1. 特点 2. 流程 一.UDP 无连接: 多个客户端可以发送消息给服务器 1. 流程 服务器: socket ...

  8. 网络通信:单播、广播、组播

    网络通信:单播.广播.组播 本文文件夹: 一.网络通信的分类.他们的定义和特点. 二.单播.广播.组播的传输信息的网络拓扑模型. 三.单播.广播.组播的编程实例. 一.网络通信的分类.他们的定义和特点 ...

  9. 组播 收发_[HCIARoutingamp;Switching]网络篇单播广播和组播

    组播是什么 传统的IP通信有两种方式:一种是在源主机与目的主机之间点对点的通信,即单播:另一种是在源主机与同一网段中所有其它主机之间点对多点的通信,即广播. 如果要将信息发送给多个主机而非所有主机,若 ...

最新文章

  1. nero 8 简体中文版能生成真正能用的序列号的注册机
  2. markdown 图片居中_Markdown常用语法汇总
  3. you should specify the `steps` argument
  4. Redis有几种数据类型?文末领取面试资料
  5. decimalformat精度丢失_php intval 两位小数乘以100后结果少1
  6. Ubuntu 下面用ibus在opera中输入中文
  7. 鸿蒙空间最高级,洪荒:我能进化万物
  8. 操作系统银行家算法(课程设计报告)JAVA实现
  9. paip.PHP-asp—jsp实现事件机制 WEBFORM式开发
  10. 苹果手机长截屏_发现一个手机必备软件
  11. 数字图像处理(dip)
  12. 皮尔逊相关系数和斯皮尔曼相关系数
  13. 基于深度学习的人脸识别技术综述
  14. 阿里P4 - P14技能要求及对应薪资曝光
  15. woff文件 服务器上找不到,vue Iview 项目部署到服务器上woff2文件 net::ERR_ABORTED 404 (Not Found)怎么处理?...
  16. Qt:使用元对象编辑器Moc
  17. MSP430 G2553 Launchpad实现电容测量
  18. 计算机专业人才培养评价意见,谈高职计算机专业人才培养综合评价.pdf
  19. Linux命令行下设置黑底绿字
  20. 全国计算机专业录取分数线排名,2020中国高校录取分数线排名全国大学录取分数线表...

热门文章

  1. 【牛客网-前端笔试题】——Javascript专项练习7
  2. 美国纽约大学超级计算机中心,纽约大学超级计算集群系统案例
  3. 精准解决IDEA中文字体大小不一 奇奇怪怪
  4. 做生信分析平台需要什么配置的服务器?生信分析平台服务器配置建议
  5. PHP配合layUI实现图片上传实例
  6. 蓝桥杯之Python算法设计系列(一)
  7. 优秀 python 开源项目
  8. 前端页面几种常见的布局方式
  9. 2007上海户口评分标准(转载)
  10. PSO算法(优化与探索四*DDPG与GAN)