共享内存及网络通信

news2024/11/26 20:44:22

共享内存 ------ 最高效的进程间通信

一个内核预留的空间,两进程绑定同一块共享空间

避免了用户空间 到 内核空间的数据拷贝

IPC 操作流程

key值 ==> 申请 ==>读写 ==>关闭 ==>卸载
1,产生key值    函数ftok

 key_t ftok(const char *pathname, int proj_id);
  功能: 将pathname 和 proj_id 转换为 key值 
  参数:    @pathname  //给一个路径名 (获得文件编号)
              @proj_id   //工程id 最低有效8位,可用字符代替     eg: 'A'
 返回值  成功 key值    失败 -1   

  2,通过key值申请共享内存    函数shmget

int shmget(key_t key, size_t size, int shmflg);
功能:使用唯一键值key向内核提出共享内存使用申请
参数:key   唯一键值
          size  要申请的共享内存大小(单位字节)
          shmflg 申请的共享内存访问权限,八进制表示
          如果是第一个申请,则用IPC_CREAT并加权限 如 0666
          如果要检测是否存在,用IPC_EXCL
    返回值:
            成功 返回共享内存id,一般用shmid表示
            失败  -1;


3,共享内存绑定到进程空间     函数shmat

void *shmat(int shmid, const void *shmaddr, int shmflg);
功能:将指定shmid对应的共享内存映射到本地内存。
参数:shmid 要映射的本地内存
          shmaddr 本地可用的地址,如果不确定则用NULL,表示由系统自动分配。
          shmflg :  0 ,  表示读写
                         SHM_RDONLY, 只读
 返回值:成功 返回映射的地址,一般等于shmaddr   失败 (void*)-1    

4,解绑   函数shmdt

int shmdt(const void *shmaddr);
功能:将本地内存与共享内存断开映射关系。
参数:shmaddr 要断开的映射地址。
返回值:成功  0  失败  -1;

5,销毁共享内存   函数shmctl

int shmctl(int shmid, int cmd, struct shmid_ds *buf); 
功能:修改共享内存属性,也可以删除指定的共享内存对象。
参数:shmid 要删除的共享内存对象
          cmd : IPC_RMID 删除对象的宏
          buff : NULL 表示只删除对象。
返回值:成功 0  失败 -1

两个进程通过产生同一key值绑定同一块共享内存

进程1

  

进程2

进程2中对s输入数据,s绑定共享内存,进程1从共享内存中获取数据;

进程1获取pid绑定到共享内存,进程2通过共享内存获取到pid,通过pid给进程1发送信号,进程1接收信号,从而完成进程2发送一个数据进程1打印一个循环

网络通信-------不同主机间进程通信方式

ip地址  标识网络中一台主机     主机----能够进行网络通信的机器

osi参考模型 
    1. 物理层 
       规定了物理层面的电气特性及相关机械特性 
     物理层面数据的传输 ---  一位一位二进制数据   //比特流 
    2. 数据链路层 
       规定了 传输数据的格式  //帧数据 
       //控制传输过程可靠 
     3. 网络层 (网际层)
       用于解决 网络 与 网络之间 数据传输  //数据包 
     4. 传输层 
       传输控制层,控制传输过程,保证数据完整和可靠 
    5. 会话层  
       处理一次会话过程 
    6. 表示层 
       规定了 传输数据的格式 和 方式  //加密 
    7. 应用层 
       就是直接获取要收发的数据    
IP   通过ip可以找到一台主机

端口号  用来标识主机中一个具体(进行网络通信)的进程

ip + 端口 --- 进程在网络中地址

IP 32位整型数值   表示方式“点分十进制”

每个字节用  .  分隔,每个字节用十进制表示,范围0-255   如:192.168.1.166

ip地址组成  网络号+主机号

网络号表示所处的网络,主机号表示所容纳的主机数

TCP(即传输控制协议):是一种面向连接的传输层协议,它能提供高可靠性通信(即数
据无误、数据无丢失、数据无失序、数据无重复到达的通信)

* 适用情况:
1. 适合于对传输质量要求较高,以及传输大量数据
的通信。
2. 在需要可靠数据传输的场合,通常使用TCP协议
3. QQ等即时通讯软件的用户登录账户管理相关
的功能通常采用TCP协议

tcp协议特点:
1. 面向连接   //类似打电话通话之前 ,必须先打通 
2. 可靠传输   //保证数据准确可靠 (tcp协议机制 里面的功能 )
3. 面向字节流程

UDP(User Datagram Protocol)用户数据报协议,是不可靠的无连接的协议。
在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输。

* 适用情况:
1. 发送小尺寸数据(如对DNS服务器进行IP地址查询时)
2. 在接收到数据,给出应答较困难的网络中使用UDP。(如:无
线网络)
3. 适合于广播/组播式通信中。
4. MSN/QQ/Skype等即时通讯软件的点对点文本通讯以及音视频通
讯通常采用UDP协议
5. 流媒体、VOD、VoIP、IPTV等网络多媒体服务中通常采用UDP
方式进行实时数据传输

UDP特点:    //广播 
1.不可靠 
2.无连接 
3.数据报  

编程模型 
     c/s    client server    客户端,服务器模型     --- 专用客户端 
     b/s    browser server   浏览器,服务器模型     --- 通用的客户端 
     p2p    peer to peer     点对点传输 
 

基于UDP c/s通信模型:
客户端 --- 角色  --- 主动的角色  
socket    //1.一种特殊的文件 --- 专门用于网络通信(不同主机间的进程)
          //2.socket 编程接口  --- socket 函数 
          //提供了一个可以访问 操作系统 网络功能的接口 

sendto //发数据 
... 

服务器端 --角色 --- 被动的角色  
socket 
recvfrom    //接收数据 

函数socket

int socket(int domain, int type, int protocol);
功能:程序向内核提出创建一个基于内存的套接字描述符    
参数:   
      //domain --域 (范围) ---socket 用于什么范围的通信
      //           ipv4 
     //               ipv6 
      domain  地址族,PF_INET == AF_INET ==>互联网程序
                      PF_UNIX == AF_UNIX ==>单机程序
      type    套接字类型:
                SOCK_STREAM  流式套接字 ===》TCP   
              SOCK_DGRAM   用户数据报套接字===>UDP
              //SOCK_RAW     原始套接字  ===》IP
      protocol 协议 ==》0 表示自动适应应用层协议。

返回值:成功 返回申请的套接字文件描述符   失败  -1

函数sendto

  ssize_t sendto(    int sockfd,           //用于通信的socket对应的fd
                      const void *buf,           //表示要发送的数据所在的一块空间 
                              size_t len,           //表示发送的字节数 
                                 int flags,           //0  --- 默认  
 const struct sockaddr *dest_addr,   //表示 要发送到的 地址 (网络地址 ip+端口号 ) 
                socklen_t addrlen             //表示dest_addr 这个参数的长度 
                );
 返回值: 成功  发送出去的字节的数   失败  -1 

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

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

相关文章

谷粒商城实战笔记-230-商城业务-认证服务-页面效果完成

这一节主要是完善各种页面效果。 一,用户名密码登录接口存放session 之前是在微博登录成功后把用户信息放入session,用户名密码登录成功也需要把用户信息放入session。 PostMapping(value "/login")public String login(UserLoginVo vo, R…

江协科技STM32学习- P5 GPIO输出

🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝​…

坐牢第二十九天

思维导图 作业 作业: 运行1个服务器和2个客户端 实现效果: 服务器和2个客户端互相聊天,服务器和客户端都需要使用select模型去实现 服务器要监视2个客户端是否连接,2个客户端是否发来消息以及服务器自己的标准输入流 客户端要监视…

nginx-Web 服务端

nginx的简介 Nginx 是一款高性能的 Web 服务器和反向代理服务器。 高并发处理能力:采用异步非阻塞的方式处理请求,能够在高并发场景下快速响应。 轻量级和高效:资源消耗相对较少,启动速度快。 优秀的反向代理和负载均衡功能&a…

2053. 图的bfs遍历

代码 #include<bits/stdc.h> using namespace std; int a[20][20],q[20]; bool f[20]; int main() {int h,t,n,e,x,y,i;cin>>n>>e;for(i1;i<e;i){cin>>x>>y;a[x][y]1;a[y][x]1;}h1;t1;q[1]1;f[1]true;cout<<1<<" ";wh…

qps测试epoll和io_uring

​ 前边我们了解了Reactor模式和Proactor模式&#xff0c;哪个性能更好呢&#xff1f;需要我们进行测试。前边我们用io_uring实现了Proactor模式&#xff0c;io_uring是2019年才加入到Linux内核中的&#xff0c;提供了三个系统调用函数。都有些抽象&#xff0c;我是直接来拿跑的…

LLM驱动的AI Agent框架:引领行业变革的应用探索与未来展望

AI Agent框架&#xff08;LLM Agent&#xff09;&#xff1a;LLM驱动的智能体如何引领行业变革&#xff0c;应用探索与未来展望 1. AI Agent&#xff08;LLM Agent&#xff09;介绍 1.1. 术语 Agent&#xff1a;“代理” 通常是指有意行动的表现。在哲学领域&#xff0c;Agen…

视频直播平台选择服务器需要注意什么?

在当今数字化时代&#xff0c;直播平台已成为连接内容创作者与广大观众的重要桥梁。为了确保直播的流畅性、稳定性和安全性&#xff0c;服务器的选择与配置显得尤为重要。以下是搭建直播平台时&#xff0c;服务器所需具备的关键因素。 一、高性能与可扩展性 直播平台需要处理大…

黑神话悟空四十二项修改器 v1.0

软件简介 黑神话悟空四十二项修改器由风灵月影精心打磨&#xff0c;为《黑神话悟空》这款备受瞩目的游戏量身定制。这款修改器界面简洁、体积小巧、功能强大&#xff0c;它致力于为玩家提供便捷的游戏体验&#xff0c;让您能够根据个人喜好和需求&#xff0c;轻松调整游戏内的…

4-1-6 arduino控制42步进电机(电机专项教程)

4-1-6 arduino控制42步进电机&#xff08;电机专项教程&#xff09; 4-1-6 arduino控制42步进电机NEMA双极性步进电机A4988如何使用arduino连接A4988驱动模块Arduino控制Nema-17步进电机&#xff08;简化版&#xff09;A4988 Vref电压调节&#xff08;具体看视频&#xff09; 4…

Java数组05:Arrays类

本节内容视频链接&#xff1a;Java数组07&#xff1a;Arrays类讲解_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV12J41137hu?p57&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 Java中的‌Array类是一个针对数组进行操作的工具类&#xff0c;‌提供了排序、‌…

SVG的基本图形:直线、圆、椭圆、矩形、多边形等的元素的使用说明。

1、先上个图看一下效果&#xff1a;这里面有直线、圆、矩形、椭圆、多边形。 SVG 可缩放矢量图形&#xff08;Scalable Vector Graphics&#xff09;。 SVG 使用 XML 格式定义图像。 2、代码实现&#xff1a; <svg width"500" height"200" viewBox&…

Kubernetes 如何给pod的 /etc/hosts文件里面添加条目

创建pod的时候&#xff0c;pod会在其/etc/hosts里面添加一个条目。 [rootmaster ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES dns-test 1/1 R…

【RabbitMQ】高级特性

本文将介绍一些RabbitMQ的重要特性。 官方文档&#xff1a;Protocol Extensions | RabbitMQ 本文是使用的Spring整合RabbitMQ环境。 生产者发送确认(publish confirm) 当消息发送给消息队列&#xff0c;如何确保消息队列一定收到消息呢&#xff0c;RabbitMQ通过 事务机制 和 …

Java重修笔记 第三十八天 String翻转

String翻转 1. 要求将字符串指定的部分进行翻转 public class StringHomework {public static void main(String[] args) {// 要求将字符串指定的部分进行翻转// 例如:abcdef ---> a edcb f 1, 4System.out.print("转换前: ");String s "abcdef";…

Libcity笔记:strnn_encoder.py

1 cal_basetime 2 calc_timeoff 3 encode 所以对于 STRNN来说&#xff0c;它的eval_data的每个元素是&#xff1a;

《Python 异常捕获全解析及 yield 关键字详解》

在 Python 中&#xff0c;异常捕获是一种处理程序运行时错误的机制&#xff0c;它可以使程序在出现错误时继续运行&#xff0c;而不是崩溃。以下是对 Python 中异常捕获的详细介绍&#xff0c;包括try、except、else、finally关键字以及对yield关键字的介绍和案例。 一、异常捕…

深入解析FSD烟火识别算法:全套源码与应用实例

一、背景 随着智能监控技术的不断发展&#xff0c;烟火识别&#xff08;Fire Smoke Detection, FSD&#xff09;算法在安防领域得到了广泛应用。传统的火灾探测方法主要依赖于温度传感器和烟雾报警器&#xff0c;这些方法在反应速度和准确性上存在一定局限。尤其是在广阔的户外…

rocketmq 同步复制,异步复制,同步刷盘,异步刷盘详解

一、刷盘模式 同步刷盘&#xff1a; 在返回写成功状态时&#xff0c;消息已经被写入磁盘。具体流程是&#xff0c;消息写入内存的PAGECACHE后&#xff0c;立刻通知刷盘线程刷盘&#xff0c;然后等待刷盘完成&#xff0c;刷盘线程执行完成后唤醒等待的线程&#xff0c;返回消息…

Visual C++ 微软常用运行库合集|dll报错必装

前言 Microsoft Visual C Redistributable&#xff08;简称MSVC&#xff0c;VB/VC&#xff0c;系统运行库&#xff09;是Windows操作系统应用程序的基础类型库组件。此版Visual C运行库组件合集&#xff08;微软常用运行库合集&#xff09;由国内封装爱好者Dreamcast打包而成&…