信号量 网络的学习

1.有名信号量

操作共享内存的步骤: ftok生成一个key值 ->通过key 用 smget 创建一组信号量(下标0,1区分),返回一个信号灯的ID -> 对信号灯的初始化 (struct sembuf 结构体成员的赋值 ,成员sem_op中-1 是申请信号量,+1是释放信号量)-> 用semop去申请或者释放信号量)->
semctl 删除共享空间

1.创建:

semget

 int semget(key_t key, int nsems, int semflg);

功能:创建一组信号量

参数:key:IPC对像的名字

           nsems:信号量的数量

            semflg:IPC_CREAT

返回值:成功返回信号量ID
              失败返回-1

2.销毁

semctl

int semctl(int semid, int semnum, int cmd, ...);

功能:向信号灯发送命令

参数:semid:信号等的ID

           semnum:具体操作信灯的编号

           cmd: IPC_RMID    删除信号灯
                      SETVAL      设置信号量的值

返回值:成功返回0;失败返回-1;

初始化:
union semun {
            int              val;    /* Value for SETVAL */
            struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
            unsigned short  *array;  /* Array for GETALL, SETALL */
            struct seminfo  *__buf;  /* Buffer for IPC_INFO
                                        (Linux-specific) */
        };

3.申请信号量 / 释放信号量

semop

int semop(int semid, struct sembuf *sops, size_t nsops);

功能:对信号量完成操作

参数:semid:信号灯的ID

           sops:信号量操作的数组的首地址

           nsops:数组元素的个数

返回值:成功返回0;失败返回-1;

unsigned short sem_num;  /* semaphore number */        操作信号量的下标
         short          sem_op;   /* semaphore operation */     具体对信号量的操作(申请:-1  释放:+1)
         short          sem_flg;  /* operation flags */         SEM_UNDO



2. 网络(数据传输,数据共享):

1.网络协议模型

OSI协议模型:

       应用层:实际发送的数据
       表示层:发送的数据是否加密
       会话层:是否建立会话连接
       传输层:数据的传输方式(数据报,流式)
       网络层:数据的路由(如何从一个局域网到达另外一个局域网)    IP地址
       数据链路层:局域网下如何通信
       物理层:物理介质的连接

TCP/IP协议模型

         应用层:传输的数据
         传输层:传输的方式
         网络层:数据如何从一台主机到达另一台主机
         网络接口层:物质介质的连接

应用层: HTTP  超文本传输协议
               hTTPS
               FTP     文件传输协议
               TFTP   简单文本传输协议
               SMTP  邮件传输协议
               MQTT  
               TELNET

 传输层:
        UDP     用户数据报协议
                特点:
                    1.实现机制简单
                    2.资源开销小
                    3.不安全不可靠

        TCP     传输控制协议
                特点:
                    1.实现机制复杂(三次握手)
                    2.资源开销大
                    3.安全可靠(四次挥手)

    网络层:
        IPv4

        IP地址:唯一标识网络中一台主机的标号
        IP地址:网络位 + 主机位
        子网掩码:用来标识IP地址的网络位和主机位
                子网掩码是1的部分表示IP地址的网络位
                子网掩码是0的部分表示IP地址的主机位
        网段号:网络位不变,主机位全为0,表示网段号
        广播地址:网络位不变,主机位全为1,表示广播地址

        IP地址类型:
        A类
            1.0.0.0 - 126.255.255.255
            子网掩码:255.0.0.0
            管理超大规模网络
            10.0.0.0 - 10.255.255.255 

        B类
            128.0.0.0 - 191.255.255.255
            子网掩码:255.255.0.0 
            管理大中规模型网络
            172.16.0.0 - 172.31.255.255

        C类
            192.0.0.0 - 223.255.255.255
            子网掩码:255.255.255.0
            管理中小规模型网络 
            192.168.0.0 - 192.168.255.255

        D类
            224.0.0.0 - 239.0.0.0
            用于组播

        E类
            240.0.0.0 - 255.255.255.255 
            用于实验

2.UDP编程

socket套接字编程 : socket 创建通信的文件描述符 -> struct sockaddr_in 结构体成员的赋值( inet_addr 将字符串地址转换为内存地址  ,htons 将本地字节序转换为网络的大端字节序) ->
sendto 向目标地址发送数据信息

    1.发端:

        socket 

        int socket(int domain, int type, int protocol);
        功能:
            创建一个用来通信的文件描述符
        参数:
            domain:使用的协议族 AF_INET (IPv4协议族)
            type:套接字类型
                SOCK_STREAM:流式套接字
                SOCK_DGRAM:数据报套接字
                SOCK_RAW:原始套接字
            protocol:协议
                默认为0 
        返回值:
            成功返回文件描述符
            失败返回-1 

        sendto 

        ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                      const struct sockaddr *dest_addr, socklen_t addrlen);
        功能:
            利用套接字向指定地址发送数据信息 
        参数:
            sockfd:套接字文件描述符
            buf:发送数据空间首地址
            len:发送数据的长度
            flags:属性默认为0 
            dest_addr:目的地址信息存放的空间首地址
            addrlen:目的地址的长度
        
        struct sockaddr_in {
            sa_family_t    sin_family; /* address family: AF_INET */
            in_port_t      sin_port;   /* port in network byte order */
            struct in_addr sin_addr;   /* internet address */
        };

        /* Internet address. */
        struct in_addr {
            uint32_t       s_addr;     /* address in network byte order */
        };
                  
        返回值:
            成功返回实际发送字节数
            失败返回-1 

        inet_addr:

        in_addr_t inet_addr(const char *cp);
        功能:  
            将字符串IP地址转换为内存中的IP地址 

        htons

        uint16_t htons(uint16_t hostshort);
        功能:
            将本地字节序转换为网络的大端字节序

eg:

int  main(void)
{int sockfd = 0;struct sockaddr_in recvaddr; //定义目的地址信息存放的结构体变量char tmpbuff[1024] = {0};char tm[1024] = {0};ssize_t nsize = 0;ssize_t msize = 0;int len = 0;fgets(tmpbuff,sizeof(tmpbuff),stdin);/*创建用来通信的UDP套接字 */sockfd = socket(AF_INET, SOCK_DGRAM, 0);   //创建一个用来通信的文件描述符if(sockfd == -1){perror("fail to socket");return -1;}/* 对接收方地址赋值 */recvaddr.sin_family = AF_INET;recvaddr.sin_port = htons(50000);   //将本地字节序转换为网络的大端字节序recvaddr.sin_addr.s_addr = inet_addr("192.168.136.1"); //将字符串IP地址转换内存中的ip地址len = sizeof(recvaddr);/*发送信息*/nsize = sendto(sockfd, tmpbuff, strlen(tmpbuff), 0, (struct sockaddr *)&recvaddr, sizeof(recvaddr)); //利用套接字向指定地址发送数据信息//套接字文件描述符,发送数据空间地址,地址大小,属性默认0,目的地地址信息存放的空间地址(强制转换),地址大小if (-1 == nsize){perror("fail to sendto");return -1;}printf("已发送%ld个字节!!!\n",nsize);memset(tmpbuff,0,sizeof(tmpbuff));msize= recvfrom(sockfd,tm,sizeof(tm),0,(struct sockaddr *)&recvaddr,&len);puts(tm);close(sockfd);return 0;
}


        
    

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

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

相关文章

基于Google Vertex AI 和 Llama 2进行RLHF训练和评估

Reinforcement Learning from Human Feedback 基于Google Vertex AI 和 Llama 2进行RLHF训练和评估 课程地址:https://www.deeplearning.ai/short-courses/reinforcement-learning-from-human-feedback/ Topic: Get a conceptual understanding of Reinforcemen…

vue3 (四)动态组件Vs异步组件

1.动态组件 点击toggle切换2个组件&#xff0c;配合<keep-alive>使用防止切换后数据丢失 <keep-alive><component :is"currentItem"></component> </keep-alive> 2.异步组件 定义方法&#xff1a;app.component(组件名,Vue.defineAs…

西安雁塔未来人工智能计算中心算力成本分析

先看一例旧闻&#xff1a;西部“最强大脑”落户雁塔——30亿亿次超算能力助力创新之城建设 其中提到一期算力为 300PFLOPS FP16&#xff08;每秒30亿亿次半精度浮点计算&#xff09;&#xff0c;项目总投资约为19亿元。 这个算力是什么概念呢&#xff1f; 我们以深度学习训练中…

GIS之深度学习06:CUDA12安装(适配版)

CUDA&#xff08;Compute Unified Device Architecture&#xff09;是NVIDIA开发的并行计算平台和编程模型&#xff0c;用于利用NVIDIA GPU的并行计算能力&#xff0c;它允许开发者使用类似于C语言的编程语言编写并行程序&#xff0c;利用GPU的大规模并行计算能力加速各种类型的…

C语言写学生信息管理系统

说明:本博文来自CSDN-问答板块,题主提问。 需要:用C语言设计一个学生信息管理系统(尽量不使用指针),学生信息包括学号,姓名,数学成绩,C语言成绩,英语成绩和每个学生的总成绩这几项。系统要实现如下几个功能:1.添加学生2.删除学生3.修改学生信息4.查询学生信息5进行学…

关于Linux上的$ORIGIN解说

1、Linux RPATH & $ORIGIN 许多现代C / C 项目都利用Autotools创建GNU构建系统&#xff0c;例如 根据平台生成make文件。 可执行文件&#xff08;二进制文件&#xff09;在生成/编译过程中生成&#xff0c;并且可以在执行编译的计算机上本地执行。 但是&#xff0c;如果将…

2024大厂Java面试最火问题,1200页文档笔记

前言 ⽂章有点⻓&#xff0c;请耐⼼看完&#xff0c;绝对有收获&#xff01;不想听我BB直接进⼊⾯试分享&#xff1a; 准备过程蚂蚁⾦服⾯试分享拼多多⾯试分享字节跳动⾯试分享最后总结个人所得&#xff08;供大家参考学习&#xff09; 当时我⾃⼰也准备出去看看机会&#…

Claude 3家族惊艳亮相:AI领域掀起新浪潮,GPT-4面临强劲挑战

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-agd7RSCGMblYxo85 {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

图像检测 - 模板匹配 - 多模板匹配图像检测

1、前言 模板匹配是指在特定的图像中,找到指定目标的过程。这里的制定目标就是模板,从图像的找到模板就叫做模板匹配 模板匹配的大概流程就是将模板作为类似滤波器,在图像上进行滑动,计算重叠区域像素点的差异,这里可以是方差等等。 具体的算法可以参考:图像检测 - 模板…

实践:Git 如何撤回已 Push 的代码

一、IDEA 操作 操作指南&#xff1a; 第一步&#xff0c;查看提交记录&#xff0c;找到撤回的索引&#xff08;记录&#xff09;。 第二步&#xff0c;工作目录&#xff08;也就是项目代码&#xff09; 回推到指定版本。 第三步&#xff0c;强制提交。 到此&#xff0c;仓库的…

微服务知识03

1、ES搜索引擎,高性能的分布式搜索引擎,底层基于Lucene 主要用于应用程序中的搜索系统 日志收集 2、基础概念 3、ES处理流程 5、下载中文分词器 Releases infinilabs/analysis-ik GitHub 6、分词模式 最细粒度拆分、智能分词 7、Elaticsearch配置流程 (1)把文件拖进…

Mybatis和Spring Data Jpa的优缺点比较(八股文)

ORM&#xff08;Object-Relational Mapping&#xff09;框架是一种用于实现对象与关系数据库之间映射的工具或库。它可以将数据库中的表和记录映射成对象和属性&#xff0c;使开发人员可以使用面向对象的方式操作数据库&#xff0c;而不需要编写复杂的SQL语句。ORM框架的主要功…

基于单片机的蓝牙无线密码锁设计

目 录 摘 要 Ⅰ Abstract Ⅱ 引 言 1 1 系统总体设计 3 1.1 系统设计要求 3 1.2 系统设计思路 3 2 系统硬件设计 5 2.1 设计原理 5 2.2 主控模块 5 2.3 芯片模块 8 2.4 矩阵键盘模块 9 2.5 液晶显示模块 10 2.6 继电器驱动模块 12 2.7 蜂鸣器模块 13 2.8 蓝牙模块 14 3 系统软…

一本书讲透ChatGPT,实现从理论到实践的跨越!大模型技术工程师必读

程序员如何选择职业赛道&#xff1f; 文章目录 程序员如何选择职业赛道&#xff1f;前言**作者简介**目录直播预告 前言 OpenAI 在 2022 年 11 月推出了人工智能聊天应用—ChatGPT。它具有广泛的应用场景&#xff0c;在多项专业和学术基准测试中表现出的智力水平&#xff0c;不…

为什么LLMs不适合编程

使用LLMs进行编码的挑战 自制形象 在过去的一年中&#xff0c;大型语言模型&#xff08;LLMs&#xff09;凭借其自然语言理解能力展示出了惊人的能力。这些先进的模型不仅重新定义了自然语言处理的标准&#xff0c;而且还广泛应用于各种应用和服务中。 对使用LLMs进行编码的兴…

96.Go设计优雅的错误处理(带堆栈信息)

在之前的两篇文章中&#xff0c;我们已经介绍过错误的一些优雅处理 75.错误码设计、实现统一异常处理和封装统一返回结果 88.Go设计优雅的错误处理 本文想继续写一篇&#xff0c;可以作为工具包直接使用。也是记录一种新的思路和编码技巧&#xff0c;同时创建错误的时候会自动…

Dubbo的集群容错方案

Dubbo提供了多种集群容错方案来保证分布式环境下的高可用性。这些容错方案可以在服务提供者不可用时&#xff0c;根据不同的业务需求和场景&#xff0c;选择不同的策略来处理。以下是Dubbo支持的一些主要集群容错方案&#xff1a; 1. Failover Cluster&#xff08;失败自动切换…

Ubuntu 20.04 ROS1 与 ROS2 通讯

激光雷达和3d视觉传感器驱动很多都是基于ros1开发的&#xff0c;由于自己项目在ros2环境开发&#xff0c;需要获取从驱动出来的点云数据流&#xff0c;所以尝试订阅ros1出来的点云topic话题&#xff0c;固需要ros1与ros2之间建立通讯连接。 项目环境&#xff1a; Legion-Y7000…

Android Intent 传递数据过大问题

/** * 通过Intent传递或者返回的数据是存放在一个叫做Binder transaction buffer的缓存区&#xff0c;这个缓冲区的大小为1Mb(Android 28 Platform)&#xff0c;当缓冲区不够用时就会抛出异常 * 如果有多个数据传递同时进行&#xf…

【Linux】linux | 验证端口是否开放 | 基于linux工具

一、场景 1、多台服务器&#xff0c;做负载均衡 2、应用服务访问基础服务&#xff0c;端口不通&#xff1b;比如&#xff1a;redis 3、验证是防火墙问题还是redis配置问题 二、操作 1、下载工具nmap yum -y install nmap 2、验证命令 nmap -p 80,6380,8848,3306 192.168.1.…