网络编程04-UDP的广播、组播

news2024/11/27 6:24:05

目录

一、UDP广播通信

1、什么是广播

2、特点

3、广播地址

4、实现广播的过程(一定是使用UDP协议)

广播发送端

广播接收方

练习1: 把广播通信进行实现

发送端

接收端

二、UDP组播(群聊)

1、概念

2、组播特点

3、IP地址分类

特殊地址 

4、接收端怎么接收组播消息? -->需要加入组播属性的套接字 

5、组播通信的过程

发送端

接收端

发送端

接收端


一、UDP广播通信

1、什么是广播

单播:数据包发送方式只有一个接受方
广播:同时发给局域网中的所有主机

2、特点

只有用户数据报套接字(使用UDP协议)才能广播

3、广播地址

以192.168.63.0网段为例: . .***.255 代表该网段的广播地址。发送给该地址的数据包被所有主机接收
比如我们当前教室的局域网段 是 192.168.63.0 ,那么广播地址就是 192.168.63.255
sendto("你好",192.168.14.255);

4、实现广播的过程(一定是使用UDP协议)

 

广播发送端

1、创建数据报套接字 UDP
int socketfd = socket(AF_INET,SOCK_DGRAM,0);
2、设置socketfd套接字文件描述符的属性为 广播 。(也就是允许发送广播数据包SO_BROADCAST -----》使用广播方式传送
int on=1;
setsockopt(sockfd , SOL_SOCKET,SO_BROADCAST,&on, sizeof(on));
3、发送数据 ,指定接收方为广播地址
struct sockaddr_in sendAddr;
sendAddr.sin_family = AF_INET;
sendAddr.sin_port = htons(10000);
sendAddr.sin_addr.s_addr = inet_addr("192.168.14.255");//一定是广播地址,广播发送
sendto(sockfd,buf,strlen(buf),0,(struct sockaddr*)&sendAddr,sizeof(sendAddr));
4、关闭
close();

广播接收方

1、创建用户数据报套接字
int socketfd = socket(AF_INET,SOCK_DGRAM,0);
2、绑定(192.168.14.255)广播IP地址和端口号 (10000)
注意:绑定的端口必须和发送方指定的端口相同
struct sockaddr_in ownAddr;
ownAddr.sin_family = AF_INET;
ownAddr.sin_port = htons(10000);
//uint32_t htonl(uint32_t hostlong); 将 主机IP转为 网络IP
ownAddr.sin_addr.s_addr = htonl(INADDR_ANY);//INADDR_ANY(0.0.0.0) 代表本机所有的地址 
//inet_addr("192.168.63.255");
3、接收数据
recvfrom();
4、关闭
close();

练习1: 把广播通信进行实现

发送端

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
	   
#define GUANG_IP	"192.168.11.255"
#define GUANG_PORT	60001

int main()
{
	//建立套接字
	int socket_fd = socket(AF_INET,SOCK_DGRAM,0);
	if(socket_fd < 0)
	{
		perror("sokcet fail");
		return -1;
	}
	
	
	//设置广播属性
	int on=1;
	setsockopt(socket_fd , SOL_SOCKET,SO_BROADCAST,&on, sizeof(on));	
	
	//给广播地址发送数据
	struct sockaddr_in send_addr;
	send_addr.sin_family = AF_INET;
	send_addr.sin_port = htons(GUANG_PORT);
	send_addr.sin_addr.s_addr = inet_addr(GUANG_IP);//广播地址
	
	char buf[1024] = {0};
	while(1)
	{	
		bzero(buf,sizeof(buf));
		scanf("%s",buf);
		//发送的是实际的长度
		sendto(socket_fd,buf,strlen(buf),0,(struct sockaddr *)&send_addr,sizeof(send_addr));
	}
	
	//关闭套接字
	close(socket_fd);
}

接收端

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
	   
#define GUANG_IP	"192.168.11.255"
#define GUANG_PORT	60001

int main()
{
	//建立套接字
	int socket_fd = socket(AF_INET,SOCK_DGRAM,0);
	if(socket_fd < 0)
	{
		perror("sokcet fail");
		return -1;
	}
	
	//绑定广播地址
	struct sockaddr_in my_addr;
	my_addr.sin_family = AF_INET;
	my_addr.sin_port = htons(GUANG_PORT);
	my_addr.sin_addr.s_addr = htonl(INADDR_ANY);//INADDR_ANY本机任意IP地址--常用方法
	//send_addr.sin_addr.s_addr = inet_addr(GUANG_IP);//广播地址
	bind(socket_fd,(struct sockaddr *)&my_addr,sizeof(my_addr));
	
	char buf[1024] = {0};
	int ret;
	struct sockaddr_in recv_addr;
	socklen_t addrlen = sizeof(recv_addr);
	while(1)
	{	
		bzero(buf,sizeof(buf));//清空缓冲区
		ret = recvfrom(socket_fd,buf,sizeof(buf),0,(struct sockaddr *)&recv_addr,&addrlen);
		char *ip = inet_ntoa(recv_addr.sin_addr);
		int port = ntohs(recv_addr.sin_port);
		printf("[ip:%s port:%d] buf:%s ret:%d\n",ip,port,buf,ret);
	}
	
	//关闭套接字
	close(socket_fd);
}

二、UDP组播(群聊)

1、概念

组播是介于单播与广播之间,在一个局域网内,将某些主机添加到组中,并设置一个组地址.我们
只需要将数据发送到组播地址即可,加入到该组的所有主机都能接收到数据

2、组播特点

        需要给组播设置IP 地址,该 IP 必须是 D 类地址
        只有UDP 才能设置组播

3、IP地址分类

IP地址 = 网络号 + 主机号

 

特殊地址 

4、接收端怎么接收组播消息? -->需要加入组播属性的套接字 

#define IP_ADD_MEMBERSHIP 加入组播
// usr/include/linux/in.h
struct ip_mreq {
struct in_addr imr_multiaddr; /* 多播组的IP地址 224.0.0.10/
struct in_addr imr_interface; /* 需要加入到多组的IP地址 192.168.53.134 */
};

5、组播通信的过程

 

发送端

1、创建UDP数据报套接字
2、发送数据,往组播地址(224.0.0.10 )里面发送数据
3、关闭

接收端

(要把接收端的IP地址加入到组播里面)
1、创建UDP数据报套接字
2、定义组播结构体
struct ip_mreq vmreq;
3、设置组播ip(初始化 组播结构体)
inet_pton(AF_INET,"224.0.0.10",&vmreq.imr_multiaddr); // 组播地址
inet_pton(AF_INET,"192.168.63.2",&vmreq.imr_interface); // 需要添加到组的ip
#ininclude <arpa/inet.h>
int inet_pton(int af, const char *src, void *dst);
参数:
        af : 你要选择哪一种协议族 IPV4 --》AF_INET 还是 IPV6--》AF_INET6
        src:本地IP地址
        dst:将本地IP地址转为网络IP地址存储到这里
作用:
        将本地IP地址转为网络IP地址
 4、加入组播属性(也就是设置这个套接字 可以接收组播信息)
setsockopt(socketfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&vmreq,sizeof(vmreq));
 5、绑定地址
struct sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(atoi(argv[1]));
saddr.sin_addr.s_addr = htonl(INADDR_ANY); //htonl(INADDR_ANY) 代表 主机所有的地址
bind(socketfd,(struct sockaddr *)&saddr,sizeof(saddr));

 6、接收数据

 recvfrom(......)

发送端

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>

#include <netinet/in.h>
#include <arpa/inet.h>

/*
*发送端
*/

#define GROUP_IP	"224.0.0.10"
#define GROUP_PORT	60002

int main()
{
	//建立套接字
	int socket_fd;
	socket_fd = socket(AF_INET,SOCK_DGRAM,0);
	if(socket_fd < 0)
	{
		perror("socket fail");
		return -1;
	}
	
	//往组播地址发送数据
	struct sockaddr_in send_addr;
	send_addr.sin_family = AF_INET;
	send_addr.sin_port = htons(GROUP_PORT);
	send_addr.sin_addr.s_addr = inet_addr(GROUP_IP);
	bind(socket_fd,(struct sockaddr *)&send_addr,sizeof(send_addr));	
	
	//往组播地址发送数据
	char buf[1024] = {0};
	int ret;
	while(1)
	{	
		bzero(buf,sizeof(buf));
		scanf("%s",buf);

		sendto(socket_fd,buf,strlen(buf),0,(struct sockaddr *)&send_addr,sizeof(send_addr));
	}
	
	//关闭套接字
	
	close(socket_fd);
}

接收端

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>

#include <netinet/in.h>
#include <arpa/inet.h>

/*
* 接收端
*/

#define GROUP_IP	"224.0.0.10"
#define GROUP_PORT	60002

int main()
{
	//建立套接字
	int socket_fd;
	socket_fd = socket(AF_INET,SOCK_DGRAM,0);
	if(socket_fd < 0)
	{
		perror("socket fail");
		return -1;
	}
	
	//定义组播结构体
	struct ip_mreq vmreq;
	
	//添加组播地址
	inet_pton(AF_INET,"224.0.0.10",&vmreq.imr_multiaddr);
	//将自己的ip添加到到组播地址中
	inet_pton(AF_INET,"192.168.11.2",&vmreq.imr_interface);
	
	//设置组播属性到套接字中
	setsockopt(socket_fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&vmreq,sizeof(vmreq));
	
	//绑定本机任意地址
	struct sockaddr_in saddr;
	saddr.sin_family = AF_INET;
	saddr.sin_port = htons(60002);
	saddr.sin_addr.s_addr = htonl(INADDR_ANY); //htonl(INADDR_ANY) 代表 主机所有的地址
	bind(socket_fd,(struct sockaddr *)&saddr,sizeof(saddr));	
	
	//接收数据
	struct sockaddr_in recv_addr;
	socklen_t addrlen = sizeof(recv_addr);
	
	char buf[1024] = {0};
	int ret;
	while(1)
	{	
		memset(buf,0,sizeof(buf));
		ret = recvfrom(socket_fd,buf,sizeof(buf),0,(struct sockaddr *)&recv_addr,&addrlen);
		char *ip = inet_ntoa(recv_addr.sin_addr);
		int port = ntohs(recv_addr.sin_port);
		printf("[ip:%s port:%d] buf:%s ret:%d\n",ip,port,buf,ret);		
	}
	//关闭套接字
	close(socket_fd);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/4065.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(最新版2022版)剑指offer之动态规划题解

&#xff08;最新版2022版&#xff09;剑指offer之动态规划题解[剑指 Offer 42. 连续子数组的最大和][剑指 Offer 47. 礼物的最大价值][剑指 Offer 46. 把数字翻译成字符串][剑指 Offer 48. 最长不含重复字符的子字符][剑指 Offer 48. 矩形覆盖][剑指 Offer 买卖股票的最好时机…

小侃设计模式(五)-建造者模式与模板方法模式

1.概述 建造者模式&#xff08;Builder Pattern&#xff09;又叫生成器模式&#xff0c;是一种对象构建模式&#xff0c;它可以将复杂对象的建造过程抽象出来&#xff08;抽象类别&#xff09;&#xff0c;这个抽象过程的不同实现方法可以构造出不同表现&#xff08;属性&…

家庭主妇问题

一 问题描述 X 村的人们住在美丽的小屋里。若两个小屋通过双向道路连接&#xff0c;则可以说这两个小屋直接相连。X 村非常特别&#xff0c;可以从任意小屋到达任意其他小屋&#xff0c;每两个小屋之间的路线都是唯一的。温迪的孩子喜欢去找其他孩子玩&#xff0c;然后打电话给…

C++中TCP socket传输文件

在两个文件中都定义文件头和用到的宏&#xff1a; #define MAX_SIZE 10 #define ONE_PAGE 4096 struct FileHead {char str[260];int size; }; 在客户端发送接收阶段&#xff1a; //1.发送文件头char path[260] {0};cout<<"请输入文件路径"<<endl;cin…

数字图像处理MATLAB

数字图像处理MATLAB 基&#xff08;本&#xff09;操&#xff08;作&#xff09; 图片读取 Aimread(test.bmp); imshow(A);2. 图像写入 Aimread(test.bmp); imwrite(A,test-bak.bmp); Bimread(test-bak.bmp); imshow(B);3. 图像文件信息查询 infoimfinfo(test.bmp);4. 显示…

【创建型】生成器模式(Builder)

目录生成器模式(Builder)适用场景生成器模式实例代码&#xff08;Java&#xff09;生成器模式(Builder) 将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 适用场景 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方…

【SpringBoot笔记22】SpringBoot框架集成Redis数据库

这篇文章&#xff0c;主要介绍SpringBoot框架如何集成Redis数据库。 目录 一、SpringBoot集成Redis 1.1、引入依赖 1.2、配置redis连接信息 1.3、添加RedisTemplate配置类 1.4、编写测试类 1.5、运行测试 一、SpringBoot集成Redis Redis是一个非关系型数据库&#xff0c…

PCIe ECAM机制访问PCIE的配置空间

1.PCIe ECAM机制 PCI Express Enhanced Configuration Access Mechanism (ECAM)是访问PCIe配置空间的一种机制。是将PCIe的配置空间映射到MEM空间&#xff0c;使用MEM访问其配置空间的一种实现。可参考NCB-PCI_Express_Base_5.0r1.0-2019-05-22.pdf的第7.2.2小节。 其地址映射…

上海亚商投顾:沪指录得6连阳 两市成交再度破万亿

上海亚商投顾前言&#xff1a;无惧大盘大跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 三大指数今日横盘震荡&#xff0c;收盘集体小幅上扬&#xff0c;日K线均录得6连阳。虚拟现实概念股集体拉升&#…

【SA-Token】授权 鉴权中心微服务

授权 鉴权中心微服务 1 什么是JWT 1.2 JWT 的基本概念 1.3 JSON Web Token jwt 是一个开放标准 它定义了一种紧凑的、自包含的方式 用于作为JSON 对象在各方之间安全地传输信息 1.4.那些场景下可以考虑使用JWT &#xff1f; ​ 1.用户授权 信息交换 1.5 JWT的结构及其含义 …

镜频抑制滤波器对射频接收前端输出噪声的影响

射频接收前端包括LNA、Filter、Mixer等部件&#xff0c;从噪声因子级联的角度讲&#xff0c;希望接收链路第一级为高增益、低噪声系数放大器&#xff0c;以期望得到较低的系统噪声系数&#xff0c;提高接收灵敏度。除LNA外&#xff0c;接收链路还有一个关键的部件——镜频抑制滤…

精读大型网站架构:前端架构模块化的方法及困境,自研框架Trick

模块化的方法 网页和网页之间有很多相似或者相同的模块&#xff0c;模块化就是把这些模块抽离并独立管理。而模块化的方法&#xff0c;就是把模块的HTML、CSS和JavaScript文件独立出来&#xff0c;然后通过某种方法关联到使用这些模块的网页上。 在介绍模块化的具体方法之前&…

consul--基础--05--api

consul–基础–05–api 1、介绍 主要接口是RESTful HTTP API&#xff0c;该API可以用来增删查改nodes、services、checks、configguration。所有的endpoints主要分为以下类别 kv&#xff1a;Key/Value存储agent&#xff1a;Agent控制catalog&#xff1a;管理nodes和serviceshe…

数据结构-例题实训作业-二叉树相关

第1关:以先序的方式建立二叉树 任务描述 本关任务:以先序的方式建立二叉树并显示(顺时针90度后看) 相关知识 为了完成本关任务,你需要掌握: 1.二叉树的概念 2.二叉树的先序遍历方式 3.二叉树的遍历。 编程要求 在以下空白处补写代码,以先序方式完成二叉树的建立。 //…

计算机组成原理浮点数表示

浮点数表示 浮点数的表示分为阶码和尾数&#xff1b; 比如3.026*1011;阶码是11;尾数是3.026&#xff1b; 对于阶码&#xff1a; 阶符为正&#xff0c;小数点向后移n位&#xff08;n表示阶的大小&#xff09;; 阶符为负&#xff0c;小数点向前移n位&#xff08;n表示阶的大小&a…

基础IO(上)——Linux

文章目录1.储备知识2. 文件描述符2.1 c接口2.2 直接使用系统接口2.3 open函数返回值2.4 文件描述符fd2.5 周边文件3. 重定向3.1 输出重定向3.2 输出重定向3.3 追加重定向3.4 dup4. 如何理解一切皆文件&#xff1f;1.储备知识 对文件的操作范畴&#xff1a; 在系统角度理解文件 …

R语言生物群落数据统计分析

R 语言作的开源、自由、免费等特点使其广泛应用于生物群落数据统计分析。生物群落数据多样而复杂&#xff0c;涉及众多统计分析方法。本教学以生物群落数据分析中的最常用的统计方法回归和混合效应模型、多元统计分析技术及结构方程等数量分析方法为主线&#xff0c;通过多个来…

中医-通过舌象判断身体状况

本文分享通过舌象判断身体的整体状况&#xff08;中医角度&#xff09;&#xff0c;得出一个可供辨证的参考&#xff0c;并且可以根据舌象做出相关的饮食调整&#xff0c;本文主讲理论&#xff0c;相关舌象图片易引人不适&#xff0c;如需找相关图片&#xff0c;可根据本文中的…

【SpringBoot】一文了解SpringBoot配置高级

文章目录前言ConfigurationProperties使用场景小结宽松绑定/松散绑定&#x1f315;博客x主页&#xff1a;己不由心王道长&#x1f315;! &#x1f30e;文章说明&#xff1a;SpringBoot配置高级&#x1f30e; ✅系列专栏&#xff1a;SpringBoot &#x1f334;本篇内容&#xff1…

javaweb JavaScript快速入门 对象 BOM DOM 事件监听

JavaScript 引入方式 1.内部脚本&#xff1a;将 JS代码定义在HTML页面中 2.外部脚本&#xff1a;将 JS代码定义在外部 JS文件中&#xff0c;然后引入到 HTML页面中 JavaScript 基础语法 windows.alert可以省略windows var: 1.作用域为全局变量 2.变量可以重复定义 &#xf…