20240821

共享内存:

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. 物理层

规定了物理层面的电气特性

及相关机械特性

物理层面数据的传输 --- 一位一位二进制数据 //比特流

  1. 数据链路层

规定了 传输数据的格式 //帧数据

//控制传输过程可靠

  1. 网络层 (网际层)

用于解决 网络 与 网络之间 数据传输 //数据包

  1. 传输层

传输控制层,控制传输过程,保证数据完整和可靠

  1. 会话层

处理一次会话过程

  1. 表示层

规定了 传输数据的格式 和 方式 //加密

  1. 应用层

就是直接获取要收发的数据

实际应用到的是 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

相关推荐
A小辣椒11 小时前
TShark:Wireshark CLI 功能
linux
A小辣椒15 小时前
TShark:基础知识
linux
AlfredZhao17 小时前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao1 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush42 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5202 天前
Linux 11 动态监控指令top
linux
不会C语言的男孩2 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言