嵌入式学习记录5.18(多点通信)

一、套接字属性设置相关函数

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

       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);
       功能:获取或设置套接字相关层中的相关属性的值
       参数1:套接字文件描述符
       参数2:网络层次:
               应用层:SOL_SOCKET (man 7 socket)
               传输层(TCP):IPPROTO_TCP (man 7 tcp)
               传输层(UDP):IPPROTO_UDP (man 7 udp)
               网络层:IPPROTO_IP (man 7 ip)
        参数3:当前层要设置或获取的属性名称,每层常设置的名称如下表所示:
       参数4:要给参数3属性设置的值
       参数5:参数4的大小
       返回值:成功返回0,失败返回-1并置位错误码

#include<myhead.h>

int main(int argc, const char *argv[])
{
    //创建套接字
    int fd = socket(AF_INET, SOCK_DGRAM, 0);
    if(fd == -1)
    {
        perror("socket errorr");
        return -1;
    }

    //想要知道当前套接字能否进行端口号和地址的快速重用
    int reuse = -1;
    int optlen = sizeof(reuse);
    if(getsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuse, &optlen) ==-1)
    {
        perror("getsockopt error");
        return -1;
    }

    printf("reuse = %d\n", reuse);        // 0,表示套接字默认不允许端口号快重用

    //设置端口号快速重用
    int optval = 1;
    if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) == -1)
    {
        perror("setsockopt error");
        return -1;
    }

    //再次获取套接字属性的值
    reuse = -1;
    if(getsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuse, &optlen) ==-1)
    {
        perror("getsockopt error");
        return -1;
    }

    printf("reuse = %d\n", reuse);        // 1,表示已经设置端口号快速重用了


    return 0;
}

二、单播

就是实现一对一的通信,我们之前所学的TCP或UDP通信方式都是使用的是单播

发送端和接收端是确定的

三、多点通信

1> 实现主机之间的一对多的通信,一个发送端可以对应多个接收端

2> 对于接收端而言,无论愿不愿意接收,都会收到消息

3> 只能基于UDP实现多点通信

4> 实现多点通信的方式:广播、组播

3.1 广播

1> 能够实现主机的一对多的通信

2> 在当前网络下的所有主机都能接收到广播消息

3> 对于广播的发送端套接字而言,需要将其设置成允许广播的状态

4> 广播地址:网络号 + 255

5> 广播消息不允许穿过路由器

6> 广播分为发送端和接收端

7> 广播的发送端流程----> 类似于UDP的客户端

1、socket:创建用于通信的套接字文件描述符
2、setsockopt:设置当前套接字允许广播, level:SOL_SOCKET      optname:SO_BROADCAST     optval: int
3、bind:可绑定也可以不绑定
4、发送广播消息:sendto
        目的IP地址:广播地址
        目的Port:与接收端保持一致
5、close:关闭套接字
#include<myhead.h>
#define IP "192.168.125.255"          //广播地址
#define PORT 6789                    //端口号

int main(int argc, const char *argv[])
{
    //1、创建套接字
    int sfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sfd == -1)
    {
        perror("socket error");
        return -1;
    }

    //2、设置套接字允许广播
    int broadcast = 1;
    if(setsockopt(sfd, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(broadcast)) == -1)
    {
        perror("setsockopt error");
        return -1;
    }


    //3、发送消息
    //3.1 填充对端地址信息结构体
    struct sockaddr_in rin;
    rin.sin_family = AF_INET;
    rin.sin_port = htons(PORT);
    rin.sin_addr.s_addr = inet_addr(IP);

    char sbuf[128] = "";
    while(1)
    {
        //从终端获取数据
        printf("请输入>>>");
        fgets(sbuf, sizeof(sbuf), stdin);
        sbuf[strlen(sbuf)-1] = 0;

        //将数据广播出去
        sendto(sfd, sbuf, strlen(sbuf), 0, (struct sockaddr*)&rin, sizeof(rin));
        printf("发送成功\n");
    }

    //4、关闭套接字
    close(sfd);

    return 0;
}

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

1、socket:创建用于通信的套接字文件描述符 2、bind:必须绑定 IP地址:广播地址 Port:与发送端保持一致 3、recvfrom:接收广播消息 4、close:关闭套接字

#include<myhead.h>
#define IP "192.168.125.255"          //广播地址
#define PORT 6789                    //端口号

int main(int argc, const char *argv[])
{
    //1、创建套接字
    int rfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(rfd == -1)
    {
        perror("socket error");
        return -1;
    }

    //2、绑定ip和端口号
    //2.1 填充地址信息结构体
    struct sockaddr_in rin;
    rin.sin_family = AF_INET;
    rin.sin_port = htons(PORT);
    rin.sin_addr.s_addr = inet_addr(IP);

    //2.2 绑定
    if(bind(rfd, (struct sockaddr*)&rin, sizeof(rin)) == -1)
    {
        perror("bind error");
        return -1;
    }

    //3、接受消息
    char rbuf[128] = "";
    while(1)
    {
        bzero(rbuf, sizeof(rbuf));         //清空容器
        //读取数据
        recvfrom(rfd, rbuf, sizeof(rbuf), 0, NULL, NULL);
        //recv(rfd, rbuf, sizeof(rbuf), 0);

        printf("收到广播消息:%s\n", rbuf);
    }

    //4、关闭套接字
    close(rfd);

    return 0;
}

3.2 组播

1> 组播也是实现一对多的通信

2> 组播地址:D类网络---> [224.0.0.0 -- 239.255.255.255]

3> 组播也分为发送端和接收端,对于接收端而言,要加入多播组后,才能收到组播消息

4> 组播的发送端 ----> 类似于UDP的客户端

1、socket:创建用于通信的套接字文件描述符
2、bind:可绑定也可以不绑定
3、发送广播消息:sendto
        目的IP地址:组播地址
        目的Port:与接收端保持一致
4、close:关闭套接字
#include<myhead.h>


int main(int argc, const char *argv[])
{
    //1、创建套接字
    int sfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sfd == -1)
    {
        perror("socket error");
        return -1;
    }

    //3、发送消息
    //3.1 填充对端地址信息结构体
    struct sockaddr_in rin;
    rin.sin_family = AF_INET;
    rin.sin_port = htons(5555);
    rin.sin_addr.s_addr = inet_addr("224.1.1.1");  //组播地址

    char sbuf[128] = "";
    while(1)
    {
        //从终端获取数据
        printf("请输入>>>");
        fgets(sbuf, sizeof(sbuf), stdin);
        sbuf[strlen(sbuf)-1] = 0;

        //将数据广播出去
        sendto(sfd, sbuf, strlen(sbuf), 0, (struct sockaddr*)&rin, sizeof(rin));
        printf("发送成功\n");
    }

    //4、关闭套接字
    close(sfd);

    return 0;
}

5> 组播的接收端 ----> 类似于UDP的服务器端

1、socket:创建用于通信的套接字文件描述符
2、setsockopt:将当前套接字加入多播组, level:IPPROTO_IP    optname:IP_ADD_MEMBERSHIP    optval:struct ip_mreq
                 struct ip_mreqn {
                               struct in_addr imr_multiaddr;    //广播地址
                               struct in_addr imr_address;      //主机ip
                               int            imr_ifindex;      //网卡编号   可以通过指令 ip ad 进行查看当前网卡设备的编号
                           };

3、bind:必须绑定
        IP地址:广播地址
        Port:与发送端保持一致
4、recvfrom:接收广播消息
5、close:关闭套接字
#include<myhead.h>

int main(int argc, const char *argv[])
{
    //1、创建套接字
    int rfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(rfd == -1)
    {
        perror("socket error");
        return -1;
    }

    //2、加入多播组
    //2.1 创建结构体变量
    struct ip_mreqn imq;
    imq.imr_multiaddr.s_addr = inet_addr("224.1.1.1");    //广播地址
    imq.imr_address.s_addr = inet_addr("192.168.125.221");  //主机IP
    imq.imr_ifindex = 2;            //网卡索引
    //2.2 设置套接字
    if(setsockopt(rfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &imq, sizeof(imq)) == -1)
    {
        perror("setsockopt error");
        return -1;
    }
    printf("加入多播组成功\n");

    //3、绑定
    //3.1 填充地址信息结构体
    struct sockaddr_in rin;
    rin.sin_family = AF_INET;
    rin.sin_port = htons(5555);         //端口号
    rin.sin_addr.s_addr = inet_addr("224.1.1.1");   //组播IP

    // 3.3绑定
    if(bind(rfd, (struct sockaddr*)&rin, sizeof(rin)) == -1)
    {
        perror("bind  error");
        return -1;
    }


    //4、接受消息
    char rbuf[128] = "";
    while(1)
    {
        bzero(rbuf, sizeof(rbuf));         //清空容器
        //读取数据
        recvfrom(rfd, rbuf, sizeof(rbuf), 0, NULL, NULL);
        //recv(rfd, rbuf, sizeof(rbuf), 0);

        printf("收到组播消息:%s\n", rbuf);
    }

    //5、关闭套接字
    close(rfd);

    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue3学习(三)

前言 继续接上一篇笔记&#xff0c;继续学习的vue的组件化知识&#xff0c;可能需要分2个小节记录。前端大佬请忽略&#xff0c;也可以留下大家的鼓励&#xff0c;感恩&#xff01; 一、理解组件化 二、组件化知识 1、先上知识点&#xff1a; 2、示例代码 App.vue (主页面) …

人类和小鼠转录组上游分析

基础软件 conda install cutadapt, trimmomatic, samtools, hisat2, subread, deeptools -y人类转录组上游分析 # 样本名称 sample_namesample# 线程 threads4# 双端测序原始fastq1和fastq2路径 fastq1_path/path/${sample_name}_1.fq.gz fastq2_path/path/${sample_name}_2.…

SRS视频服务器应用研究

1.SRS尝试从源码编译启动 1.1.安装ubuntu 下载镜像文件 使用VMWare安装&#xff0c;过程中出现蓝屏&#xff0c;后将VM的软件版本从15.5升级到17&#xff0c;就正常了。

WPS PPT学习笔记 2 结构页的制作

制作PPT结构页 制作封面页、目录页、封底页。它们都属于结构页。而时间轴页&#xff0c;流程图页&#xff0c;框架图页这些属于内容页。 做一份PPT 讲一个故事 封面页 开头&#xff0c; 目录页 脉络&#xff0c; 各式内容页 详情&#xff0c; 封底页 结尾。 所有的结构页…

Linux系统编程学习笔记

1 前言 1.1 环境 平台&#xff1a;uabntu20.04 工具&#xff1a;vim,gcc,make 1.2 GCC Linux系统下的GCC&#xff08;GNU Compiler Collection&#xff09;是GNU推出的功能强大、性能优越的多平台编译器&#xff0c;是GNU的代表作品之一。gcc是可以在多种硬体平台上编译出可执…

【自用题库】2024/华三/H3CNE安全GB0-510

【网工必备】华三H3CNE-安全-510 题库覆盖百分百&#xff0c;题库有291道总结汇总 还有vce加vce文件模拟真实考试环境 到手文件夹5样东西&#xff01;&#xff01;&#xff01; 认证简介&#xff1a;H3CNE-Security&#xff08;H3C Certified Network Engineer For Security&am…

Dubbo生态之深度分析sentinel的流量控制

1. 深度了解sentinel限流规则参数的含义 博客Dubbo生态之sentinel限流-CSDN博客中有dubbo集成sentinel的demo演示 在sentinel中&#xff0c;限流的直接表现形式就是&#xff0c;在执行Entry nodeA SphU.entry(resourceName)的时候抛出FlowException异常&#xff0c;FlowExce…

Octo:伯克利开源机器人开发框架

【摘要】在各种机器人数据集上预先训练的大型策略有可能改变机器人学习&#xff1a;这种通用机器人策略无需从头开始训练新策略&#xff0c;只需使用少量领域内数据即可进行微调&#xff0c;但具有广泛的泛化能力。然而&#xff0c;为了广泛应用于各种机器人学习场景、环境和任…

OpenCV学习 基础图像操作(十四):直方图均衡化和直方图规定化

基础原理 直方图操作是基于像素统计的基础图像操作,被广泛运用于调整图像的对比度,并由此衍生出很多变种和该经的方式. 图像相直方图 直方图(Histogram)&#xff0c;又称质量分布图&#xff0c;是一种统计报告图&#xff0c;由一系列高度不等的纵向条纹或线段表示数据分布的…

在马达驱动上的MOS产品选型分析与应用

电机的应用非常广泛&#xff0c;可以说大部分动的产品内部都有电机的身影&#xff0c;其主要的应用领域有风机、泵、散热风扇、电动工具、智能家居、以及汽车应用等等。随着各国出台了更加严格的用电标准&#xff0c;节能电机成为了市场关注的热点&#xff0c;而BLDC电机具有高…

用大模型搭建一个自己的新闻小助手

背景 信息快速增长的时代&#xff0c;及时获取到有价值的资讯是一件很必要的事情。已经有各类新闻app和获取信息的渠道了&#xff0c;为什么还需要在构建一个小助手来获取新闻资讯呢&#xff1f;其实原因很简单各类新闻app服务的是具体一类人群&#xff0c;个人和人群还是有偏…

【leetcode 203】 移除链表元素

题目 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5]示例 2&#xff1a; 输入&…

【class18】人工智能初步----语音识别(4)

【class17】 上节课&#xff0c;我们学习了: 语音端点检测的相关概念&#xff0c;并通过代码切分和保存了音频。 本节课&#xff0c;我们将学习这些知识点&#xff1a;1. 序列到序列模型2. 循环神经网络3. 调用短语音识别接口 知其然&#xff0c;知其所以然 在调用语…

香橙派 AIpro 昇腾 Ascend C++ 分类模型适配

香橙派 AIpro 昇腾 Ascend C 分类模型适配 flyfish 文章目录 香橙派 AIpro 昇腾 Ascend C 分类模型适配前言一、PyTorch官网resnet模型处理方式1、PyTorch模型 导出 onnx格式2、完整测试 输出top1结果3、完整测试 输出top5结果 二、YOLOv8官网resnet模型Python处理方式三、昇腾…

NSSCTF-Web题目3

目录 [BJDCTF 2020]easy_md5 1、知识点 2、题目 3、思路 [ZJCTF 2019]NiZhuanSiWei 1、知识点 2、题目 3、思路 第一层 第二层 第三层 [BJDCTF 2020]easy_md5 1、知识点 弱比较&#xff0c;强比较、数组绕过、MD5加密 2、题目 3、思路 1、首先我们跟着题目输入&a…

微信好友,如此的陌生,渐渐都成了只是人名!也许没有利益关系导致!

微信里一直聊天聊的挺好的朋友&#xff0c;不知怎么到后来却联系少了&#xff0c;最后渐渐的变成躺在微信备注里的一个陌生朋友&#xff01; 以前通过工作认识了一个朋友&#xff0c;初次见面的印象不是很深刻了&#xff0c;只记得当时给我的印象是对方很有礼貌&#xff0c;特别…

快团团帮卖团长如何修改供货大团长复制帮卖团的信息?

一、功能说明 在复制帮卖团中&#xff0c;帮卖团长可以选择&#xff1a;①修改团购内容 ②同步大团长的团购内容 二、具体操作步骤 点击“编辑后帮卖”&#xff0c;在团购设置中设置开启/关闭“同步大团长内容” 开启“同步大团长内容”后&#xff0c;大团长修改图文后&#xf…

分享个自用的 Nginx 加强 WordPress 防护的规则

Nginx WordPress 的组合是目前非常普及的组合了&#xff0c;我们完全可以借助 Nginx 规则来加强 WordPress 的防护&#xff0c;提高 WordPress 的安全性&#xff0c;今天明月就给大家分享个自用的 Nginx 针对 WordPress 的防护规则&#xff0c;部分规则大家只需要根据自己的需要…

计算机图形学入门02:线性代数基础

1.向量&#xff08;Vetors&#xff09; 向量表示一个方向&#xff0c;还能表示长度&#xff08;向量的摸&#xff09;。一般使用单位向量表示方向。 向量加减&#xff1a;平行四边形法则、三角形法则。比卡尔坐标系描述向量&#xff0c;坐标直接相加。 1.1向量点乘&#xff08;…

腾讯云联络中心ivr调用自定义接口

1&#xff0c;java代码&#xff1a;http接口 RequestMapping(value "/getMsg5", method RequestMethod.POST) public Map<String, String> index(RequestBody Map<String, String> params) {String id params.get("id");HashMap<String…