IPC对象(共享内存)
共享内存:
1.是一块,内核预留的空间
2.最高效的通信方式
//避免了用户空间 到 内核空间的数据拷贝
用中间那个get函数,就可以使key与共享内存一一对应
怎么将共享内存与进程关联起来
//step1 产生key值
ftok:
功能:
将pathname 和 proj_id 转换为key值
参数:
pathname: //给一个路径名
proj_id://工程id eg:‘A’、
返回值:
成功 Key值
失败 -1
//step2 通过key获取ipc对象
功能:
使用唯一键值key向内核提出共享内存使用申请
参数:
ipcs:s:show:展示当前工作系统内的共享内存
key:唯一键值要申请的共享内存大小
size:要申请的共享内存的大小
shmflg:申请的共享内存访问权限,八进制表示
如果是第一个申请,则用IPCCREAT
如果要检测是否存在,用IPCEXC
返回值:
成功 返回共享内存id,一般用shmid表示
失败 -1
share memory attach
//step3 共享内存 绑定
网络
网络:
不同主机间的通信问题
情景:
实现网络通信
1.物理层面 有一个 信息通路
有线
无线
5G
4G
星链
2.软件层面(逻辑) 也需要 一个通路
为了解决不同体系结构的网络互联问题,制定了(OSI网络模型)
OSI七层模型(参考模型):
1.物理层
规定了物理层面的电气特性(比如1V表示高电平这类的)
及相关机械特性
物理层面数据的传输 -----一位一位二进制数据 //比特流
2.数据链路层
规定了 传输数据的格式 //帧数据
目的:就是为了保证物理层数据传输是可靠地
//控制传输过程可靠
3.网络层(网际层)
解决网络 与 网络 之间的 数据传输 //数据包
4.传输层
传输控制层,控制传输过程,保证数据完整和可靠
5.会话层
处理一次会话过程
6.表示层
规定了 传输数据的格式 和 方式 //加密
7.应用层
直接获取要收发的数据
实际使用的是TCP/IP模型
应用层
传输层
网络层
数据链路层
物理层
4层模型:
应用层
传输层
网络层
网络接口层
如何发挥作用?
每个层次中,都有一套自己的规范 ---- 协议
底层协议都是为了上层协议服务的
ARP:地址解析协议
IP地址:就是代表你这台主机的身份证
作用:标识 网络中的一台主机
主机:凡是能够进行网络通信的机器
操作系统角度:
用户层 应用层
内核层 传输层 //这些层次,操作系统已经实现
网络层 //tcp/ip 协议 栈(网络协议栈)
数据链路层
物理层
基本上内核层,操作系统都已经帮我们实现了,我们可以操作的只有应用层
IP地址 //用来标识网络中的一台主机 ---- 通过ip可以找到对应的一台主机
端口号://用来表示主机中某一个具体(进行网络通信)进程
ip+端口号 //进程在网络中的 地址
本质:
32位整形数值
表示方式:
点分十进制
0-255
IP地址的组成:
网络号 + 主机号
网络号 ----表示所处的网络
主机号 ----表示能容纳的主句
主机号全0:表示 网络号
全1:表示 广播
网络编程:
tcp/udp协议:
应用层通过socket访问传输层
tcp协议:
特点:
1.面向连接 // 类似打电话通话之前,必须先打通
2.可靠传输 // 保证数据准确可靠(实现:tcp协议机制 里面的功能)
3.面向字节流程
udp协议:对可靠性要求不高的 WIFI
特点: //广播
1.不可靠
2.无连接
3.数据报
编程实现:
编程模型:
c/s client server 客户端-服务器模型 ------ 专用客户端
b/s browser server 浏览器-服务器模型 ------ 通用客户端
p2p peer to peer 点对点传输
p2p :使用的人越多,传输的效率越好
基于udp c/s通信模型
//client ---------客户端 ----角色 ------主动的角色
socket
//1.一种特殊的文件 -----专门用于网络通信(不同主机间的进程)
//2.socket 编程接口 ---- socket函数
//提供了一个可以访问 操作系统 网络功能的接口
sendto //发数据
//server --------服务器端 -----角色 ----被动的角色
socket
recvfrom //接收数据
....
//socket 创造通信的一端
可以将socket当做一个特殊的文件。创造通信的一端并返回一个文件描述符。
domain:
type(细节)
type如果写0的话就是默认。
sendto:
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
参数:
sockfd: //用于通信的socket对应的fd
buf: //表示要发送的数据所在的一块空间
len: //表示发送的字节数
flags://
dest_addr: //
addrlen: //
返回值:
成功: 发送出去的字节的数目
失败: -1