一、IPC 进程间通信方式
共享内存 //最高效的进程间通信方式
不需要把用户的东西再复制到内核
他们与内核进行绑定
共享内存:
1、是一块,内核预留的空间
2、最高效的通信方式
//避免了用户空间到内核空间的数据拷贝
IPC通信方式 ---操作流程类似的
进程操作:
system v :共享内
这个getc()和内存进行了共享
二、操作
2.1、key值得产生
功能:
将pathname和proj_id 转换为key值
参数
- pathname 给一个路径名
- proj_id 给一个字符,最低有效8位
返回值
- 成功返回值是 key值
- 失败-1
注意
- 如果传.的话,我们必须保证是同一个目录,否则产生的key不一样。
- 所以我们一般写/,代表根目录,根目录只有一个
2.2、通过key值获取ipc对象(共享内存)
shmget(shared memory )
- 第一个参数:是第一步产生的同一个名字,是唯一键值
- 第二个参数;指定内存块的大小,申请的共享内存的大小
- 第三个参数:代表申请的标志(可以指定权限)
- 如果是第一个申请,则用IPC_CREAT
- 如果是第二个申请,则用TPC_EXCT
返回值
- 成功:返回共享内存id,一般用shmid表示
- 失败 -1
注意点
- ipcs 代表展示系统里面共享的内存块
- 进程建立关联
2.3、共享内存 绑定
- 第一个参数,是指第二步的共享内存块
- 第二个参数,本意是指要与绑定的空间
- 第三个参数,表示对权限
返回值
- 成功 返回绑定的地址
- 失败
2.4、解绑
解绑只是说他们之间的关系,不在存在了,但是开的内核空间并没有消除掉
#include <sys/ipc.h>
#include <sys/shm.h>
ps auxlgrep a.out
shared memory getint shmget(keyt key,size t size,int shmflg);
功能:
使用唯一键值key向内核提出共享内存使用申请参数:
参数
- key唯一键值
- size 要申请的共享内存大小
- shmflg 申请的共享内存访问权限,八进制表示
- 如果是第一个申请,则用IPCR如果要检测是否存在,用IPCEXC
返回值:
- 成功 返回共享内存id,一般用shmid表示
- 失败 -1;
2.5、销毁
删除只做一个,否则会有争议,因为本身就是一个地方,不需要删多次
删除对象:shmct1
int shmctl(int shmid,int cmd, struct shmid ds *buf);//ctl = control
功能:
修改共享内存属性,也可以删除指定的共享内存对象。
参数:
- shmid 要删除的共享内存对象
- cmd
- IPC RMID 删除对象的宏
- buff NULL 表示只删除对象。
返回值:
- 成功0
- 失败-1
三、进程间通信方式
3.1、基本概念
不同主机间 //网络通信
1、物理层面 有一个 信息通路
- 有线
- 无线
- 4G
- 5G
- 星链
2、软件层面(逻辑层面)也需要 一个通路
能够让其能够进行网络通信(不同主机之间)制定相同的标准(OSI 网络模型)(开放的互联模型)
IP 代表的是一个在网络中的身份证号
IP 地址:
作用 标识 网路中的一台主机
主机 -- 凡是能够进行网络通信的机
3.2、进程通信标准协议
引用模型(参考模型)
OSI模型
1、物理层
规定了物理层面的电气特性及相关机械特性
物理层面数据的传输--- 一位一位的二进制数据
2、数据链路层(物理层的电气特性对应不同的数据格式)
规定了 传输数据的格式 //帧数据 保证物理层的数据可靠
//保证传输过程可靠
3、网络层(网际层)
用于解决网络与网络之间的数据传输 //数据包
4、运输层(传输层)
传输控制层,控制传输过程,保证数据完整和可靠(保证网络与网络)
5、会话层
处理一次会话过程(用来管理)
6、表示层
规定了 传输数据的格式 和方式 //加密
7、应用层
直接获取要收发的数据
实际应用到的是 TCP /IP 模型(要知道每层的作用)
五层
- 应用层
- 传输层
- 网络层
- 数据链路层
- 物理层
4层模型
- 应用层
- 传输层
- 网络层
- 网络接口层
3.3、如何发挥作用?
每个层次中,都有自己的一套规范 --- 协议
底层协议是为了上面服务
IEEE802wifi用的就是
对网络划分
3.4、从操作系统角度出发
用户层 应用层 《--------- 程序员(应用层从传输层取数据)
内核层 传输层 //这些层次,操作系统已经实现
网络层 //tcp/ip 协议 栈(网络协议层)
数据链路层
物理层
linux里面基本上已经把上面四层写好了
IP //用来标识网络中的一台主机 ----- 通过IP可以找到对应一台主机
3.5、IP号
//用来标识主机中的某一个具体(进行网络通信)的进程
本质:32位整型数值
表示方式 :点分十进制(为了方便人类)
0~255
IP地址的组成:
网络号 + 主机号
注意点
- 网络号就是告诉我们在同一个地址。
- ip + 端口 就能够确认通信的进程//进程在网络的地址
- 主机号----表示能容纳的主机
- 全是1,广播地址
- 全是0 ,网络号(一般都是不用)
四、网络编程
4.1、Tcp协议
TCP(即传输控制协议):是一种面向连接的传输层协议,它能提供高可靠性通信(即数据无误、数据无丢失、数据无失序、数据无重复到达的通信)
*适用情况:
1.适合于对传输质量要求较高,以及传输大量数据的通信。
2:在需要可靠数据传输的场合,通常使用TCP协议3.MSN/QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TcP协议
TCP协议的特点
1、面向连接
2、可靠传输
面向连接 ------ //类似打电话通话之前,必须先打通
2、可靠传输//保证数据准确可靠(tcpx协议机制,里面的功能)
3、面向字节流程
4.2、UDP协议
UDP(User Datagram Protocol)用户数据报协议,是不可靠的无连接的协议。在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输。
*适用情况:
1.发送小尺寸数据(如对DNS服务器进行IP地址查询时)2.在接收到数据,给出应答较困难的网络中使用UDP。(如:无线网络)
3.适合于广播/组播式通信中。4.MSN/Q2/skype等即时通讯软件的点对点文本通讯以及音视频通讯通常采用UDP协议5.流媒体、VOD、VoIP、IPTV等网络多媒体服务中通常采用UDP方式进行实时数据传输
UDP特点(对可靠性要求不高,效率高的)WIFI相当于
1、不可靠(只管发,不管其他)//广播
2、无连接()
3、数据报
五、编程实现
5.1、编程模型:
- c/s client server 客户端服务器 ----- 专用客户端
- b/s browser secer 浏览器服务器模型 ---- 通用客户端
- p2p peer to peer 点对点传输
- p2p 人越多速度越快
- 离得越近越快
5.2、基于UDP c/s通信模型
//client 客户端 ---- 主动的角色
socket // 1、一种特殊的文件----- 专门用于网络通信(不同主机间的进程)
//2、socket 编程接口 --- socket函数提供了一个可以访问操作系统网络功能的接口
sendto // 发数据
//server 服务器 ----- 服务器端--- 被动角色
socket
recvfrom //接收数据
.... 具体操作自己来做
5.3、socket 创建通信的一端
创建文件的一端并且返回文件的描述符返
回这一端。
区域的,可以选择协议
功能:程序向内核提出创建一个基于内存的套接字描述符
参数:
//domain --域(范围)---socket 用于什么范围的通信
domain 地址族,PF_INET =AF_INET=>互联网程序
PF_UNIX==>AF_UNIX==>单机程序
type 套接字类型:
SOCK_STREAM流式套接字 =--》TCP
SOCK_DGRAM用户数据报套接字=-->UDP
SOCK_RAW原始套接字 ===》IP
protocol 协议 ==》0 表示自动适应应用层协议。
type
反回值:
成功 返回申请的套接字id
失败-1:
1、提供可靠,双向,基于字节流
2、提供不可靠,无连接
3、0(全部写0),流报默认tcp,报就是默认udp
5.4、sendto()
参数
- 1、用于通信的socket对应的fd
- 2、表示要发送的数据所在的一块空间
- 3、表示发送的字节数
- 4、0写0,表示以默认方式发送
- 5、表示 要发送到的地址(网络地址IP +端口号)
- 6、表示dest_addr 这个参数的长度
返回值
成功:发送出去的字节的数目
失败:-1
5.5、端口号
端口号:
16位数值(unsigned short)//0~65535(65536个数)//标示一个进程
TCP和 UDP 的端口号是独立的端口号:
(1)功能
- 作用:唯一的标识一个进程
- 每一个应用程序进程有一个端口号,
- 通讯时区分数据包属于哪个应用程序进程
(2)分类
端口号一般由IANA(Internet Assigned NumbersAuthority)
1、管理众所周知端口:
1~1023(1~255之间为众所周知端口,256~1023端口通常由UNIX系统占用)知名端口号(已经分配给标准应用服务软件)如:
http协议用到的端口号 80
2、已登记端口:1024~49151
注册端口号(非标准应用服务软件的软件可以申请的端口号范围)
3、动态或私有端口://50000 以上的端口号
49152~65535 动态分配的端口号(系统动态分配给应用程序使用的)
注意
- 区分进程用端口号
- 已登记;要用的话,向组织申请一下
六、注意在编程中遇到的问题
一般不用上述的内容,我们用这个更具具体,因为那个没有IP
因为不同的主机,可能数据格式不一样,所以我们在此要求是大端模式;所以转换一下
因为我们的数据类型是32位无符号类型的,所以也需要用函数转成对应类型