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

相关推荐
Flying_Fish_roe9 分钟前
linux-安全管理-防火墙与网络安全
linux·数据库·oracle
不见长安见晨雾20 分钟前
Linux:vim编辑技巧
linux·编辑器·vim
神秘的土鸡1 小时前
Linux中使用Docker容器构建Tomcat容器完整教程
linux·运维·服务器·docker·容器·tomcat
TravisBytes1 小时前
linux 系统是如何收发数据包
linux·运维·服务器
ice___Cpu3 小时前
Linux 基本使用和 web 程序部署 ( 8000 字 Linux 入门 )
linux·运维·前端
z202305083 小时前
linux 之0号进程、1号进程、2号进程
linux·运维·服务器
狐心kitsune3 小时前
erlang学习:Linux常用命令1
linux·学习·erlang
DREAM依旧4 小时前
《深入了解 Linux 操作系统》
linux
阿赭ochre5 小时前
Linux环境变量&&进程地址空间
linux·服务器
Iceberg_wWzZ5 小时前
数据结构(Day14)
linux·c语言·数据结构·算法