IPC 进程间的通信方式:直接操作内核中的物理内存,效率高效的一种方式;
操作:system V:共享内存(最高效的进程间通信);
MMU 内存管理单元(虚拟);
共享内存:1.是一块内核预留的空间;2.最高效的通信方式;
(避免了用户空间到内核空间的的数据拷贝);
IPC对象操作通用框架:
Key值 à 申请 à 读写 à 关闭 à 卸载;
操作流程:
1.产生key值
#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
2.通过key获取ipc对象(共享内存)
shmget shared memory
申请对象: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
3.共享内存 绑定
shmat
映射对象:shmat()
void *shmat(int shmid, const void *shmaddr, int shmflg);
3
功能:将指定shmid对应的共享内存映射到本地内存;
参数:shmid 要映射的本地内存
shmaddr 本地可用的地址,如果不确定则用NULL,表示由系统自动分配。
shmflg 0 , 表示读写
SHM_RDONLY, 只读
返回值:成功 返回映射的地址,一般等于shmaddr
失败 (void*)-1
暂停信号 pause
4.解除绑定(映射)
撤销映射:shmdt
int shmdt(const void *shmaddr);
功能:将本地内存与共享内存断开映射关系。
参数:shmaddr 要断开的映射地址。
返回值:成功 0;失败 -1;
5.销毁IPC对象
删除对象:shmctl
int shmctl(int shmid, int cmd, struct shmid_ds *buf); //ctl = control
功能:修改共享内存属性,也可以删除指定的共享内存对象。
参数:shmid 要删除的共享内存对象
cmd :IPC_RMID 删除对象的宏
buff NULL 表示只删除对象。
返回值:成功 0;失败 -1
总结: 1、共享内存数据的存储方式是拷贝还是剪切?
拷贝
2、共享内存的数据如果多次不同进程读写会怎么样?
同一操作对象,数据没有偏移情况下会覆盖。
IPC对象 -- 共享内存
消息队列
信号量集
网络编程:不同主机间的通信问题;
实现网络通信
- 网络在物理层面:需要有一个信息通路;(有线、无线、5G、星链等);
- 软件层面(逻辑层面)也需要有一个通路;
- 网络编程的标准
网络编程
Open System Interconnect (OSI网络模型) ios
为了解决不同体系结构的网络的互联问题,
国际标准化组织ISO(注意不要与OSI搞混)
于1981年制定了开放系统互连参考模型
(Open System Interconnection Reference Model,OSI/RM)。OSI
International Organization for Standardization (IOS)
Open System Interconnection Reference Model,OSI/RM
参考 osi七层模型
osi参考模型
1. 物理层
规定了物理层面的电气特性
及相关机械特性
物理层面数据的传输 --- 一位一位二进制数据 比特流
2. 数据链路层
规定了 传输数据的格式 帧数据 控制传输过程可靠
3. 网络层 (网际层)
用于解决 网络 与 网络之间 数据传输 数据包
4. 传输层
传输控制层,控制传输过程,保证数据完整和可靠
5. 会话层
处理一次会话过程
6. 表示层 规定了 传输数据的格式 和 方式 加密
7. 应用层 就是直接获取要收发的数据
实际应用到的是 tcp/ip 模型
应用层
传输层
网络层
数据链路层
物理层
操作系统角度:
用户层 应用层 <---- 程序员
-----------------[socket]----------------------
内核层 传输层 这些层次 操作系统已经实现
网络层 tcp/ip 协议 栈 (网络协议栈)
数据链路层
物理层
IP //用来标识网络中的一台主句 ---- 通过ip可以找到对应一台主机
本质: 32位整型数值
表示方式 点分十进制
0~255
192.168.1.149
ip地址的组成:
网络号 + 主机号
网络号 ---表示所处的网络
主机号 ---表示能容纳的主机
端口号
//用来表示主机中某一个具体(进行网络通信)进程
ip+端口 //进程在网络的 地址
网络编程:
tcp / udp
TCP(即传输控制协议):是一种面向连接的传输层协议,它能提供高可靠性通信(即数
据无误、数据无丢失、数据无失序、数据无重复到达的通信)
* 适用情况:
1. 适合于对传输质量要求较高,以及传输大量数据
的通信。
2. 在需要可靠数据传输的场合,通常使用TCP协议
3. QQ等即时通讯软件的用户登录账户管理相关
的功能通常采用TCP协议
tcp协议特点:
1. 面向连接 //类似打电话通话之前 ,必须先打通
2. 可靠传输 //保证数据准确可靠 (tcp协议机制 里面的功能 )
3. 面向字节流程
UDP(User Datagram Protocol)用户数据报协议,是不可靠的无连接的协议。
在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输。
* 适用情况:
1. 发送小尺寸数据(如对DNS服务器进行IP地址查询时)
2. 在接收到数据,给出应答较困难的网络中使用UDP。(如:无
线网络)
3. 适合于广播/组播式通信中。
4. MSN/QQ/Skype等即时通讯软件的点对点文本通讯以及音视频通
讯通常采用UDP协议
5. 流媒体、VOD、VoIP、IPTV等网络多媒体服务中通常采用UDP
方式进行实时数据传输
UDP特点:广播
1.不可靠
2.无连接
3.数据报
编程:
编程模型
c/s client server 客户端,服务器模型 --- 专用客户端
b/s browser server 浏览器,服务器模型 --- 通用的客户端
p2p peer to peer 点对点传输
基于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
struct sockaddr_in {
sa_family_t sin_family; /* address family: AF_INET */
in_port_t sin_port; /* port in network byte order */
struct in_addr sin_addr; /* internet address IP */
};
/* Internet address. */
struct in_addr {
uint32_t s_addr; /* address in network byte order */
};
端口号:
端口号: 16位数值(unsigned short ) //0~65535 (65536个数)
//标示一个进程
TCP和 UDP 的端口号是独立的
端口号:
(1)
作用:唯一的标识一个进程
每一个应用程序进程有一个端口号,
通讯时区分数据包属于哪个应用程序进程
(2) 分类
端口号一般由IANA (Internet Assigned NumbersAuthority) 管理
众所周知端口:
1~1023(1~255之间为众所周知端口,256~1023端口通常由UNIX系统占用)
知名端口号(已经分配给标准应用服务软件)
如:
http协议用到的端口号 80
已登记端口:
1024~49151
注册端口号(非标准应用服务软件的软件可以申请的端口号范围)
动态或私有端口://50000 以上的端口号
49152~65535 动态分配的端口号(系统动态分配给应用程序使用的)
(3) 长度
2字节(16bit)