共享内存及网络通信

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

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

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

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 

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值