UDP广播的实现

news/2024/2/21 4:19:53

一、广播的概念

广播:由一台主机向该主机所在子网内的所有主机发送数据的方式。

            任何一个网段最后一个地址就是广播的地址

例如:192.168.5.103主机发送广播信息,那么,广播地址为192.168.5.255

则192.168.5.1~192.168.5.254所有主机都可以接收到数据。

广播的MAC地址:ff.ff.ff.ff.ff.ff

注意:广播只能用UDP或原始IP实现,不能用TCP

1.1、广播用途

    单个服务器与多个服务器主机通信时减少分组流通。
以下几个协议都用到广播:

(1)地址解析协议(ARP)
         通过IP,获取对方的MAC地址

(2)动态主机配置协议(DHCP)
         自动获取主机IP

(3)网络时间协议(NTF)
          获取当前时间

1.2、UDP广播的特点

1、处于同一子网的所有主机都必须处理数据
2、UDP数据包会沿协议栈向上一直到UDP层
3、运行音视频等较高速率工作的应用,会带来大负
4、局限于局域网内使用

1.3、UDP广播的地址

【网络ID,主机ID】
        网络ID 表示:由子网掩码中1覆盖的连续位
        主机ID 表示:由子网掩码中0覆盖的连续位


定向广播地址主机ID全1
 例:  对于192.168.220.0/24,其定向广播地址为192.168.220.255
          通常路由器不转发该广播


受限广播地址255.255.255.255
            路由器从不转发该广播

注意:在某一个局域网内广播,选择定向广播。若想在多个局域网内广播,只能选择受限广播

二、广播、多播、单播对比

2.1、单播(1对1)

单播:在同一网络内,两个设备点对点的通信就是单播通信。

打个比方:学生打小报告,学生悄悄找班主任说明情况。是不是两个人之间的对话——学生和班主任。那么用网络技术的术语来描述就是“单播”,此时信息的接收和传递只在两个节点之间进行

应用场景:收发电子邮件、浏览网页等等。

2.2、多播(1对多,此多是指定某个组)

多播:在同一网络可达范围内,一个网络设备与关心其数据的部分设备进行通信就是组播。

打个比方班主任  找   班干部  开会,地点在会议室,讨论如何管理班级学生(传输数据)。那么在网络技术上,班主任是一个正在使用多播的网络设备,而 班干部  作为班主任指定传输的对象,注意:此指定不是班主任指定的,只有当班干部进入会议室里,才可以接收到班主任派发的信息。

如果有一位班干部生病了,没来,他是不能收到信息的。

再比如:我是“史上最强大学生”的群群主,我发信息在群里(即我在使用多播),只有进入此群的人才可以接收到信息。没进的,收不到信息。你明白了??

应用场景:网上视频会议、网上视频点播等等

2.3、广播(1对所有)

广播::在同一网络可达范围内,一个网络设备向本网络内所有设备进行通信就是广播

打个比方:开会,在会场上只能有一个人拿着麦克风发言,他的发言在场的所有人都能听到。这就是广播。

三、分析广播传输

3.1、分析发送应用进程流程

 第一步:创建套接字——socket函数

第二步:设置为UDP协议和端口号(此端口为 对方的端口号 )

第三步:设置IPV4,由于是广播,ip地址  为主机ID全1.

              打个比方,我的ip地址为192.168.5.121,那么我的广播地址为192.168.5.255

第四步:设置传输为以太网,mac地址为专属广播地址   即:ff.ff.ff.ff.ff.ff

3.2、分析如何传输与接收

第一步:把打包好数据包,传送该主机所在子网内的所有主机   都发送数据包。

第二步:子网下的每一个主机都会通过数据链路,和网络层。

第三步:每个子网下的主机都会对比端口号,是否传输给我,是,就接收,不是,不接收(也可以主动接收)。

四、广播流程

发送者:
第一步:创建套接字 socket()
第二步:设置为允许发送广播权限 setsockopt()
第三步:向广播地址发送数据 sendto()


接收者:
第一步:创建套接字 socket()
第二步:将套接字与广播的信息结构体绑定 bind()
第三步:接收数据 recvfrom()

五、套接字选项(设置是否允许用广播发送)

头文件:

                 #include <sys/socket.h>
 函数:

      int setsockopt(int socket, int level, int option_name, const void *option_value, socklen_t option_len);
功能:

                设置一个套接字的选项(属性)
参数:
                socket:文件描述符
                 level:协议层次
                             SOL_SOCKET 套接字层次
                              IPPROTO_TCP tcp层次
                              IPPROTO_IP IP层次
                option_name:选项的名称
                              SO_BROADCAST 允许发送广播数据(SOL_SOCKET层次的)
                option_value:设置的选项的值
                                        int类型的值,存储的是bool的数据(1和0)

                                         0 不允许
                                         1 允许
                   option_len:option_value的长度
返回值:
                成功:0
                失败:‐1

六。广播示例

6.1、发送者(代码)

#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>         
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>int main(int argc  ,char *argv[])
{if(argc<3){printf("error lose ip port\n");exit(1);}int sockfd;if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1){perror("fail to sockfd");exit(1);}int on =1;if(setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on))==-1){perror("fail to setsockopt");exit(1);}struct sockaddr_in mysockaddr;mysockaddr.sin_family = AF_INET;mysockaddr.sin_port =htons(atoi(argv[2]));mysockaddr.sin_addr.s_addr=inet_addr(argv[1]);socklen_t addrlen= sizeof(mysockaddr);char buf[128];while(1){	fgets(buf,sizeof(buf),stdin);if(sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&mysockaddr,addrlen)==-1){perror("fail to sendto");exit(1);}	    	}close(sockfd);return 0;}

6.2、接收者(代码)

#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>         
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>int main(int argc  ,char *argv[])
{if(argc<3){printf("input fail lose ip port");exit(1);}int sockfd;if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1){perror("fail to sockfd");exit(1);}struct sockaddr_in mysockaddr;mysockaddr.sin_family = AF_INET;mysockaddr.sin_port =htons(atoi(argv[2]));mysockaddr.sin_addr.s_addr=inet_addr(argv[1]);socklen_t addrlen= sizeof(mysockaddr);if(bind(sockfd,(struct sockaddr *)&mysockaddr,addrlen)==-1){perror("fail to bind");exit(1);}char buf[128];struct sockaddr_in sendsockaddr;socklen_t sendaddrlen=sizeof(sendsockaddr);while(1){	if(recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&sendsockaddr,&sendaddrlen)==-1){perror("fail to recvfrom");exit(1);}printf("[%s ‐ %d]: %s\n", inet_ntoa(sendsockaddr.sin_addr), ntohs(sendsockaddr.sin_port),buf);}close(sockfd);return 0;}

允许结果

 

总结:由于只有一台主机,无法更加深刻感受到广播的强大。

发送者:把需要发送的信息发到——广播地址当中,从众多子网下 找到相对应的端口号,传输给对方。

接收者,绑定自己的ip,设置相对应的端口号。

不理解的地方:就是接受者不设置成广播地址,无法接收发送者传输的信息。

理想情况,不应该是我设置成子网ip,端口号一致,就可以收到信息。

我总结为:unbantu所运行的两个程序,都是在同一个ip中。或者只有一台主机的问题。


https://www.xjx100.cn/news/444362.html

相关文章

UDP广播

概述&#xff1a; 网络上的广播指&#xff1a;由一台主机向该主机所在子网内&#xff08;同一个局域网&#xff09;的所有主机发送数据的方式。实现广播&#xff0c;离不开广播地址&#xff0c;同一个子网&#xff08;局域网&#xff09;的所有主机网卡都会接收所在网段广播地…

四波混频/三波混频

四波混频 四波混频是由约瑟夫森电感的类克尔非线性引起的&#xff0c;满足 L J − 1 &#xff08; ϕ &#xff09; ≈ &#xff08; 1 − γ ′ ϕ 2 &#xff09; L J 0 − 1 L_J^{-1}&#xff08;\phi&#xff09;\approx&#xff08;1-\gamma\phi^2&#xff09;L_{J0}^{-1…

UDP之广播

目录 一.IP地址简介二.广播的实现原理三.广播的Server代码实现 1.setsockopt&#xff1a;给socketfd开放广播权限2.指定发送给Client的端口 说明&#xff1a;UDP广播的Server端为什么要指定Client的端口具体实现四.UDP之广播C/S模型五.UDP之广播C/S模型代码 ServerClient 一.IP…

用udp实现广播通信

特点&#xff1a; 1.数据传输不用建立连接&#xff0c;所以不可靠&#xff08;符合udp协议的特点&#xff09; 2.数据的发送是面向整个子网的&#xff0c;任何一台在子网内的计算机都可以接收到相同的数据&#xff1b; 3.广播用于udp和原始IP,不能用于TCP 用途&#xff1a; 1.定…

子域名接管劫持

什么是域名劫持&#xff1f; 域名劫持也被称为DNS劫持&#xff0c;它通过攻击域名解析服务器、伪造域名解析服务器的方法&#xff0c;拦截目标的域名解析请求&#xff0c;将目标网站域名解析到错误的地址上&#xff0c;让攻击目前无法回应访问。 子域名接管漏洞通常被滥用于以…

c++—继承、继承方式

1. c三大核心功能 &#xff08;1&#xff09;封装&#xff1a;提高代码的维护性&#xff0c;遇到问题可以准确定位&#xff1b; &#xff08;2&#xff09;继承&#xff1a;提高代码的复用性&#xff0c;注意不是ctrlc,ctrlv&#xff0c;而是不做任何修改或操作源码就能实现代码…

年度发布 | MeterSphere一站式开源持续测试平台发布v2.10 LTS版本

2023年5月25日&#xff0c;MeterSphere一站式开源持续测试平台正式发布v2.10 LTS版本。这是继2022年5月发布v1.20 LTS版本后&#xff0c;MeterSphere开源项目发布的第三个LTS&#xff08;Long Term Support&#xff09;版本。MeterSphere开源项目组将对MeterSphere v2.10 LTS版…

院考 c语言知识点完整版

马上c语言考试了,写一篇博客根据考试范围对应了一下之前微信里老师发过的习题(考试会有很多原题),把题目整理一下,也帮助一下身边的小伙伴。欢迎评论交流。&#xff08;补充后两章完整版&#xff09; 一、考试范围 二、各章微信习题整理 第一章习题与知识点 1.一个c语言的执…