共享内存:
1.是一块,内核预留的空间
2.最高效的通信方式
//避免了用户空间 到 内核空间的数据拷贝
//step1 产生key值
ftok //
#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok(const char *pathname, int proj_id);
功能:
将pathname 和 proj_id 转换为 key值
参数:
@pathname //给一个路径名
@proj_id //工程id eg: 'A'
返回值
成功 key值
失败 -1
//step2 通过key获取ipc对象 (共享内存)
shmget //shared memory
//1、申请对象:shmget()
#include <sys/ipc.h>
#include <sys/shm.h>
ps aux|grep a.out
shared memory get IPC_CREAT|0666
int shmget(key_t key, size_t size, int shmflg);
功能:
使用唯一键值key向内核提出共享内存使用申请
参数:key 唯一键值
size 要申请的共享内存大小
shmflg 申请的共享内存访问权限,八进制表示
如果是第一个申请,则用IPC_CREAT
如果要检测是否存在,用IPC_EXCL
返回值:
成功 返回共享内存id,一般用shmid表示
失败 -1;
share memory attach
//step3 共享内存 绑定
shmat
映射对象:shmat()
void *shmat(int shmid, const void *shmaddr, int shmflg);
功能:将指定shmid对应的共享内存映射到本地内存。
参数:shmid 要映射的本地内存
shmaddr 本地可用的地址,如果不确定则用NULL,表示
由系统自动分配。
shmflg
0 , 表示读写
SHM_RDONLY, 只读
返回值:
成功 返回映射的地址,一般等于shmaddr
失败 (void*)-1
//step4 解除绑定(映射)
撤销映射:shmdt
int shmdt(const void *shmaddr);
功能:将本地内存与共享内存断开映射关系。
参数:shmaddr 要断开的映射地址。
返回值:成功 0
失败 -1;
//step4 销毁IPC对象
删除对象:shmctl
int shmctl(int shmid, int cmd, struct shmid_ds *buf); //ctl = control
功能:
修改共享内存属性,也可以删除指定的共享内存对象。
参数:shmid 要删除的共享内存对象
cmd
IPC_RMID 删除对象的宏
buff NULL 表示只删除对象。
返回值:成功 0
失败 -1
osi参考模型
1. 物理层
规定了物理层面的电气特性
及相关机械特性
物理层面数据的传输 --- 一位一位二进制数据 //比特流
2. 数据链路层
规定了 传输数据的格式 //帧数据
//控制传输过程可靠
3. 网络层 (网际层)
用于解决 网络 与 网络之间 数据传输 //数据包
4. 传输层
传输控制层,控制传输过程,保证数据完整和可靠
5. 会话层
处理一次会话过程
6. 表示层
规定了 传输数据的格式 和 方式 //加密
7. 应用层
就是直接获取要收发的数据
实际应用到的是 tcp/ip 模型
应用层
传输层
网络层
数据链路层
物理层
4层模型
应用层
传输层
网络层
网络接口层
TCP(即传输控制协议):是一种面向连接的传输层协议,它能提供高可靠性通信(即数
据无误、数据无丢失、数据无失序、数据无重复到达的通信)
UDP(User Datagram Protocol)用户数据报协议,是不可靠的无连接的协议。
在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输。
基于UDP c/s通信模型:
//client ---客户端 --- 角色 --- 主动的角色
socket //1.一种特殊的文件 --- 专门用于网络通信(不同主机间的进程)
//2.socket 编程接口 --- socket 函数
//提供了一个可以访问 操作系统 网络功能的接口
sendto //发数据
...
//server --- 服务器端 --角色 --- 被动的角色
socket
recvfrom //接收数据
...
//socket
int socket(int domain, int type, int protocol);
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
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
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