嵌入式学习——3——多点通信

1、套接字选项(socket options)

int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);

int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);

功能:获取或设置套接字在不同层级上的相关属性

参数:

sockfd:  要获取或设置的套接字文件描述符

level:     表示要获取或设置的层

                        应用层        SOL_SOCKET

                        传输层        IPPROTO_TCP  IPPROTO_UDP

                        网络层        IPPROTO_IP

optname:当前层的数下名称见下表

optval:     要获取或设置的属性值的起始地址

optlen:     optval的大小

返回值:成功 0   失败 -1  并重置错误码

快速重用地址

int reuse = 1;
if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))==-1) {perror("setsockopt error");return -1;
}

2、单播

1、主机之间存在的是一对一的通信方式,交换机以及路由器对数据只进行转发,不进行复制

2、每次只有两个实体之间进行相互通信,发送端和接收端都是唯一确定的

3、广播和组播的区别

组播是一种多对多的通信方式,其中消息被发送到一个特定的组播地址,只有加入该组播地址的主机才能接收到这个消息。组播允许发送方只向特定的一组接收方发送消息,可以在节省带宽的同时实现多对多通信,广泛应用于IP电话、视频会议、多媒体流等场景。


广播是一种发送消息给所有主机的通信方式。在广播中,消息被发送到一个广播地址,该地址会被所有网络中的主机接收。广播是一种无条件的发送方式,因此它常常被用于网络中一些需要向所有主机广播消息的场景,例如DHCP自动分配IP地址和ARP协议中解析MAC地址等。
总结:组播和广播的主要区别在于它们【发送消息的方式】和目【标接收者的范围不同】。广播是一种无条件的发送方式,消息被发送到所有主机;而组播则是有条件的发送方式,消息只会被发送到加入该组播地址的特定主机。

4、广播

1、广播是允许通信实体之间完成一对多的通信方式,网络对其中每一台发送数据的主机信息都进行无条件的复制后并转发给其他所有主机

2、所有的主机都会收到广播消息(不管是否愿意接收)

3、广播只能由UDP通信方式来实现

4、广播消息,只能在当前网络中进行传播,不允许传过路由器

5、广播地址:网络号 + 255

6、广播分为发送端和接收端实现

        3.1 广播的发送端------->类似于UDP的客户端

socket          创建用于通信的套接字文件描述符

setsockopt (SOL_SOCKET   SOBROADCAST )           设置该套接字允许发送广播消息

bind         绑定IP地址和端口号(可选)

sendto          向广播地址发送数据

        广播地址IP:网络号 + 255

        端口号:与接收端保持一致

close          关闭套接字

int main(){//1、创建用于通信的套接字文件描述符:socketint sfd = socket(AF_INET, SOCK_DGRAM, 0);if(sfd == -1){perror("socket error");return -1;}//2、设置该套接字允许发送广播消息:setsockopt     ---> SOL_SOCKET //---> SO_BROADCASTint broadcast = 1;if(setsockopt(sfd, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(broadcast)) ==-1){perror("setsockopt error");return -1;}//3、绑定IP地址和端口号(可选)//4、向广播地址发送数据:sendto// 广播地址IP:网络号 + 255// 端口号:与接收端保持一致struct sockaddr_in rin;rin.sin_family = AF_INET;rin.sin_port = htons(6666);     //跟接收端保持一致rin.sin_addr.s_addr = inet_addr("xxx.xxx.xxx.255");//发送数据char wbuf[128] = "";while(1) {//从终端获取数据fgets(wbuf, sizeof(wbuf), stdin);wbuf[strlen(wbuf)-1] = 0;//发送给广播消息sendto(sfd, wbuf, strlen(wbuf), 0, (struct sockaddr*)&rin, sizeof(rin));printf("发送成功\n");//判断发送的消息if(strcmp(wbuf, "over") == 0){break;}}//5、关闭套接字:closeclose(sfd);return 0;}

        3.2 广播的接收端------->类似于UDP的服务器端

1、创建用于通信的套接字文件描述符

2、填充地址信息结构体:

        ip:广播地址

        port:与发送端保持一致

3、绑定端口号和IP地址(必须)

4、接受发送端发来的消息:recvfrom

5、关闭套接字:close

int main(){//1、创建用于通信的套接字文件描述符int rfd = socket(AF_INET, SOCK_DGRAM, 0);if(rfd == -1) {perror("socket error");return -1;}//2、填充地址信息结构体://ip:广播地址//port:与发送端保持一致struct sockaddr_in rin;rin.sin_family = AF_INET;rin.sin_port = htons(6666);     //端口号rin.sin_addr.s_addr = inet_addr("xxx.xxx.xxx.255"); //广播ip地址//3、绑定端口号和IP地址(必须)if(bind(rfd, (struct sockaddr*)&rin, sizeof(rin)) == -1) {perror("bind error");return -1;}//4、接受发送端发来的消息:recvfromchar rbuf[128] = "";while(1){//清空容器bzero(rbuf, sizeof(rbuf));//读取数据recv(rfd, rbuf, sizeof(rbuf), 0);//展示printf("收到广播消息:%s\n", rbuf);//判断广播是否结束if(strcmp(rbuf, "over") == 0) {break;}}//5、关闭套接字:closeclose(rfd);return 0;
}

5、组播

1、由于广播通信过程中,会占用大量的网络带宽,影响正常通信,如果通信的主机较少的话,可以引入组播

2、组播也是实现主机之间一对多的通信方式

3、要求所有接受端主机加入多播组,只有加入多播组的主机才能收到消息

4、对于发送端而言,只需向该多播组中发送消息即可,无需其他设置

5、组播也是使用UDP实现的

6、组播地址:D类网络 【224.0.0.0 --- 239.255.255.255】

7、组播也分为发送端和接收端

        4.1 组播的发送端  ---> 类似于UDP的客户端流程

1、创建用于通信的套接字文件描述符:socket

2、绑定IP地址和端口号(可选)

3、向组播地址发送数据:sendto

        广播地址IP:【224.0.0.0 --- 239.255.255.255】

        端口号:与接收端保持一致

4、关闭套接字:close

int main()
{//1、创建用于通信的套接字文件描述符:socketint sfd = socket(AF_INET, SOCK_DGRAM, 0);if(sfd == -1){perror("socket error");return -1;}//2、绑定IP地址和端口号(可选)//3、向组播地址发送数据:sendto//广播地址IP:【224.0.0.0 --- 239.255.255.255】//端口号:与接收端保持一致struct sockaddr_in rin;rin.sin_family = AF_INET;rin.sin_port = htons(5555);rin.sin_addr.s_addr = inet_addr("224.1.2.3");//数据的发送//发送数据char wbuf[128] = "";while(1){//从终端获取数据fgets(wbuf, sizeof(wbuf), stdin);wbuf[strlen(wbuf)-1] = 0;//发送给广播消息sendto(sfd, wbuf, strlen(wbuf), 0, (struct sockaddr*)&rin, sizeof(rin));printf("发送成功\n");//判断发送的消息if(strcmp(wbuf, "over") == 0){break;}}//5、关闭套接字:closeclose(sfd);return 0;
}

        4.2 组播的接收端流程 ---> 类似于UDP的服务器端流程

1、创建用于通信的套接字文件描述符:socket

2、将该套接字加入多播组:

        setsockopt ---> IPPROTO_IP --> IP_ADD_MEMBERSHIP

属性类型:

        #include <netinet/in.h>

        struct ip_mreqn {

                struct in_addr imr_multiaddr; /* 组播地址 */

                struct in_addr imr_address; /* 主机ip地址 */

                int imr_ifindex; /* 设备索引,可以通过 ip ad指令查看, 也可以填0,表示使用

                                        默认的索引*/ };

3、填充地址信息结构体:

        ip:组播地址

        port:与发送端保持一致

4、绑定端口号和IP地址(必须)

5、接受发送端发来的消息:recvfrom

6、关闭套接字:close

int main() {//1、创建用于通信的套接字文件描述符:socketint rfd = socket(AF_INET, SOCK_DGRAM, 0);if(rfd == -1) {perror("socket error");return -1;}//2、将该套接字加入多播组:setsockopt   --->  IPPROTO_IP    --> IP_ADD_MEMBERSHIP struct ip_mreqn  imr;imr.imr_multiaddr.s_addr = inet_addr("224.1.2.3");imr.imr_address.s_addr = inet_addr("xxx.xxx.xxx.xxx");//本机主机ip地址imr.imr_ifindex = 2;//设置套接字选项,加入多播组if(setsockopt(rfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &imr, sizeof(imr))==-1) {perror("setsockopt error");return -1;}//3、填充地址信息结构体://ip:组播地址//port:与发送端保持一致struct sockaddr_in rin;rin.sin_family = AF_INET;rin.sin_addr.s_addr = inet_addr("224.1.2.3");rin.sin_port = htons(5555);//4、绑定端口号和IP地址(必须)if(bind(rfd, (struct sockaddr*)&rin, sizeof(rin)) == -1) {perror("bind error");return -1;}//5、接受发送端发来的消息:recvfromchar rbuf[128] = "";while(1) {//清空容器bzero(rbuf, sizeof(rbuf));//读取数据recv(rfd, rbuf, sizeof(rbuf), 0);//展示printf("收到广播消息:%s\n", rbuf);//判断广播是否结束if(strcmp(rbuf, "over") == 0) {break;}}//6、关闭套接字:closeclose(rfd);return 0;
}

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

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

相关文章

设计模式在芯片验证中的应用——单例

一、单例模式 单例模式(Singleton)是一种创建型设计模式&#xff0c;能够保证一个类只有一个实例&#xff0c; 并提供一个访问该实例的全局节点。验证环境配置(configuration)类、超时(timeout)处理类等可以使用单例实现。比如说验证环境需要在特定场景中监测特定接口上的超时事…

STM32-GPIO八种输入输出模式

图片取自 江协科技 STM32入门教程-2023版 细致讲解 中文字幕 p5 【STM32入门教程-2023版 细致讲解 中文字幕】 https://www.bilibili.com/video/BV1th411z7sn/?p5&share_sourcecopy_web&vd_source327265f5c70f26411a53a9226af0b35c 目录 ​编辑 一.STM32的四种输…

达梦数据库创建根据日期按月自动分区表

达梦数据库创建根据日期自动分区表 概念 达梦数据交换平台(简称DMETL)是在总结了众多大数据项目经验和需求并结合最新大数据发展趋势和技术的基础上&#xff0c;自主研发的通用的大数据处理与集成平台。 DMETL创新地将传统的ETL工具&#xff08;Extract、Transform、Loading…

maven默认src下的xml,properties文件不打包到classes文件夹下

一、第一种是建立src/main/resources文件夹&#xff0c;将xml&#xff0c;properties等资源文件放置到这个目录中。maven工具默认在编译的时候&#xff0c;会将resources文件夹中的资源文件一块打包进classes目录中。 这时候注意把resources设置成resource目录&#xff0c;已经…

CI/CD 管道中的自动化测试:类型和阶段

在上一篇文章中&#xff0c;我们讨论了敏捷团队自动化测试用例的各种用例。其中一种情况是&#xff0c;团队希望将测试与每个构建集成&#xff0c;并将持续集成作为构建过程的一部分。 在本文中&#xff0c;我们将讨论持续集成/持续交付平台中的集成测试。 让我们先从基础知识…

Sentinel Dashboard 规则联动持久化方案

一、Sentinel Dashboard 规则联动持久化方案 Sentinel 是阿里开源的一个流量控制组件&#xff0c;它提供了一种流量控制、熔断降级、系统负载保护等功能的解决方案。并且我们通过 Sentinel Dashboard 可以非常便捷的添加或修改规则策略&#xff0c;但是如果细心的小伙伴应该可…

Jenkins、GitLab部署项目

1、安装JDK 1.1、下载openJdk11 yum -y install fontconfig java-11-openjdk1.2、查看安装的版本号 java -version1.3、配置环境变量 vim /etc/profile在最底部添加即可 export JAVA_HOME/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 export PATH$JAVA_HOME/…

经典链表题-链表回文结构

&#x1f389;&#x1f389;&#x1f389;欢迎莅临我的博客空间&#xff0c;我是池央&#xff0c;一个对C和数据结构怀有无限热忱的探索者。&#x1f64c; &#x1f338;&#x1f338;&#x1f338;这里是我分享C/C编程、数据结构应用的乐园✨ &#x1f388;&#x1f388;&…

神经网络的工程基础(一)——利用PyTorch实现梯度下降法

相关说明 这篇文章的大部分内容参考自我的新书《解构大语言模型&#xff1a;从线性回归到通用人工智能》&#xff0c;欢迎有兴趣的读者多多支持。 本文涉及到的代码链接如下&#xff1a;regression2chatgpt/ch06_optimizer/gradient_descent.ipynb 本文将讨论利用PyTorch实现…

BFS 解决最短路问题

目录 一、前言 1.1 如何使用 BFS 找到最短路&#xff1a; 1.2 为什么不用 dfs &#xff1a; 二、模板套路 三、例题练习 3.1 例题1&#xff1a;迷宫中离入口最近的出口 3.2 例题2&#xff1a;最小基因变化 3.3 例题3&#xff1a;单词接龙 3.4 例题4&#xff1a;为高尔…

HTML橙色爱心

目录 写在前面 准备开始 完整代码 运行结果 系列文章 写在后面 写在前面 本期小编给大家分享一颗热烈且浪漫的爱心&#xff0c;快来看看吧&#xff01; 准备开始 在开始之前&#xff0c;我们需要先简单的了解一下这颗爱心的原理哦~ 本期将用html实现这颗跳动的爱心&a…

YOLOv9改进策略 | 图像去雾 | 利用图像去雾网络UnfogNet辅助YOLOv9进行图像去雾检测(全网独家首发)

一、本文介绍 本文给大家带来的改进机制是利用UnfogNet超轻量化图像去雾网络,我将该网络结合YOLOv9针对图像进行去雾检测(也适用于一些模糊场景),我将该网络结构和YOLOv9的网络进行结合同时该网络的结构的参数量非常的小,我们将其添加到模型里增加的计算量和参数量基本可…

跨平台之用VisualStudio开发APK嵌入OpenCV(二)

开始干 新建解决方案&#xff0c;新建动态库&#xff08;Android&#xff09;项目 功能随便选一个吧&#xff0c;就模仿PS&#xff08;Photoshop&#xff09;的透视裁切功能&#xff0c;一个物体&#xff08;比如扑克牌&#xff09;透视图&#xff0c;选4个顶点&#xff0c;转…

python文件处理之os模块和shutil模块

目录 1.os模块 os.path.exists(path)&#xff1a;文件或者目录存在与否判断 os.path.isfile(path)&#xff1a;判断是否是文件 os.path.isdir(path)&#xff1a;判断是否是文件夹 os.remove(path)&#xff1a;尝试删除文件 os.rmdir(path)&#xff1a;尝试删除目录 os.m…

vue项目elementui刷新页面弹窗问题

bug&#xff1a;每次刷新页面都有这个鬼弹窗。 刚开始以为是自己的代码问题&#xff0c;于是我翻遍了每一行代码&#xff0c;硬是没找出问题。 后来在网上找了些资料&#xff0c;原来是引入的问题。 解决方案&#xff1a; 改一下引入方式即可。 错误姿势 import Vue from …

美发店服务预约会员小程序的作用是什么

美发店不同于美容美甲&#xff0c;男女都是必需且年龄层几乎不限&#xff0c;商家在市场拓展时只要方法得当相对比较容易&#xff0c;当今客户适应于线上信息获取、咨询及实际内容开展&#xff0c;商家也需要赋能和提升自身服务效率&#xff0c;合理化管理。 运用【雨科】平台…

2024年【高压电工】新版试题及高压电工找解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 高压电工新版试题是安全生产模拟考试一点通生成的&#xff0c;高压电工证模拟考试题库是根据高压电工最新版教材汇编出高压电工仿真模拟考试。2024年【高压电工】新版试题及高压电工找解析 1、【单选题】 110KV及以下…

文件批量重命名利器:一键轻松替换文本间内容,高效管理文件不再是难题!

在信息爆炸的时代&#xff0c;我们的电脑中堆积了无数的文件。这些文件可能包含重要的工作资料、珍贵的个人回忆或是各种学习资料。然而&#xff0c;随着文件的不断增多&#xff0c;如何高效地管理和查找这些文件成为了一个头疼的问题。 文件批量改名高手是一款专业的文件管理…

在IDEA中配置servlet(maven配置完成的基础下)

在IDEA中配置servlet&#xff08;maven配置完成的基础下&#xff09; 1.先新建一个项目 2.选择尾巴是webapp的&#xff0c;名称自定义 3.点击高级设置&#xff0c;修改组id 点击创建&#xff0c;等待jar包下载完成。在pom.xml中配置以下 <dependency><groupId>ja…

docker同步bilibili收藏视频到群晖,可配合emby

作者是amtoaer&#xff0c;在github项目地址&#xff1a;https://github.com/amtoaer/bili-sync 有两个版本&#xff0c;1.0和2.0&#xff0c;我使用的是2.0 PS2&#xff1a;2.0和1.0版本目录结构不兼容&#xff0c;所以部署后会全量重新下载视频。 演示&#xff1a; 依然是…