国内出名网站建设设计公司,免费二维码制作,襄城县住房和城乡建设局网站,珠海制作公司网站一、IPC#xff08;进程间通信方式#xff09;
IPC#xff1a;Inter Process Communication
共享内存#xff08;最高效的进程间通信方式#xff09; 虚拟地址 mmu(memory management unit ) 共享内存: 1.是一块#xff0c;内核预留的空间 2.最高效的…一、IPC进程间通信方式
IPCInter Process Communication
共享内存最高效的进程间通信方式 虚拟地址 mmu(memory management unit ) 共享内存: 1.是一块内核预留的空间 2.最高效的通信方式 避免了用户空间 到 内核空间的数据拷贝
二、IPC通信方式 ---操作流程类似的操作 system v 共享内存 IPC对象操作通用框架 key值 申请 》读写 》关闭 》卸载
1、产生key值 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 get 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() void *shmat(int shmid, const void *shmaddr, int shmflg); 功能将指定shmid对应的共享内存映射到本地内存。 参数shmid 要映射的本地内存 shmaddr 本地可用的地址如果不确定则用NULL 表示由系统自动分配。 shmflg 0 , 表示读写 SHM_RDONLY, 只读 返回值 成功 返回映射的地址一般等于shmaddr 失败 (void*)-1
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.物理层面
有一个信息通路 有线 无线 5G、4G、星链
2.软件层面(逻辑层面) 也需要 一个通路
3、osi七层模型
osi参考模型 1. 物理层 规定了物理层面的电气特性及相关机械特性 物理层面数据的传输 --- 一位一位二进制数据 //比特流 2. 数据链路层 规定了 传输数据的格式 //帧数据 //控制传输过程可靠 3. 网络层 (网际层) 用于解决 网络 与 网络之间 数据传输 //数据包 4. 传输层 传输控制层控制传输过程保证数据完整和可靠 5. 会话层 处理一次会话过程 6. 表示层 规定了 传输数据的格式 和 方式 //加密 7. 应用层 就是直接获取要收发的数据 实际应用到的是 tcp/ip 模型 应用层 传输层 网络层 数据链路层 物理层
4层模型 应用层 传输层 网络层 网络接口层 每个层次中都有自己的一套规范 --- 协议 操作系统角度: 用户层 应用层 ---- 程序员 -----------------[socket]---------------------- 内核层 传输层 //这些层次 操作系统已经实现 网络层 //tcp/ip 协议 栈 (网络协议栈) 数据链路层 物理层
4、IP 用来标识网络中的一台主机 通过ip可以找到对应一台主机 本质: 32位整型数值 表示方式 点分十进制 0~255 ip地址的组成: 网络号 主机号 网络号 ---表示所处的网络 主机号 ---表示能容纳的主机 端口号 用来表示主机中某一个具体(进行网络通信)进程 ip端口 //进程在网络的 地址
5、网络编程
TCP即传输控制协议是一种面向连接的传输层协议它能提供高可靠性通信(即数 据无误、数据无丢失、数据无失序、数据无重复到达的通信)
适用情况 1. 适合于对传输质量要求较高以及传输大量数据 的通信。 2. 在需要可靠数据传输的场合通常使用TCP协议 3. QQ等即时通讯软件的用户登录账户管理相关 的功能通常采用TCP协议
tcp协议特点: 1. 面向连接 //类似打电话通话之前 必须先打通 2. 可靠传输 //保证数据准确可靠 (tcp协议机制 里面的功能 ) 3. 面向字节流程
UDPUser Datagram Protocol用户数据报协议是不可靠的无连接的协议。 在数据发送前因为不需要进行连接所以可以进行高效率的数据传输。 适用情况 1. 发送小尺寸数据如对DNS服务器进行IP地址查询时 2. 在接收到数据给出应答较困难的网络中使用UDP。如无 线网络 3. 适合于广播/组播式通信中。 4. MSN/QQ/Skype等即时通讯软件的点对点文本通讯以及音视频通 讯通常采用UDP协议 5. 流媒体、VOD、VoIP、IPTV等网络多媒体服务中通常采用UDP 方式进行实时数据传输
UDP特点广播 1.不可靠 2.无连接 3.数据报
6、编程 编程模型 c/s client server 客户端服务器模型 --- 专用客户端 b/s browser server 浏览器服务器模型 --- 通用的客户端 p2p peer to peer 点对点传输
基于UDP c/s通信模型: //client ---客户端 --- 角色 --- 主动的角色 socket //1.一种特殊的文件 --- 专门用于网络通信(不同主机间的进程) //2.socket 编程接口 --- socket 函数 //提供了一个可以访问 操作系统 网络功能的接口 sendto //发数据 //server --- 服务器端 --角色 --- 被动的角色 recvfrom //接收数据
1、socket
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
2、端口号 16位数值(unsigned short ) //0~65535 (65536个数) //标示一个进程 TCP和 UDP 的端口号是独立的
(1) 作用 唯一的标识一个进程 每一个应用程序进程有一个端口号 通讯时区分数据包属于哪个应用程序进程
(2) 分类 端口号一般由IANA (Internet Assigned NumbersAuthority) 管理 众所周知端口 1~10231~255之间为众所周知端口256~1023端口通常由UNIX系统占用 知名端口号(已经分配给标准应用服务软件) 如: http协议用到的端口号 80 已登记端口 1024~49151 注册端口号(非标准应用服务软件的软件可以申请的端口号范围) 动态或私有端口//50000 以上的端口号 49152~65535 动态分配的端口号(系统动态分配给应用程序使用的)
(3) 长度 2字节(16bit) 数字转换函数 主机转网络 uint32_t htonl(uint32_t hostlong); ipv4 192.168.0.1 1~65535 uint16_t htons(uint16_t hostshort); 网络转主机host to net net to host uint32_t ntohl(uint32_t netlong); uint16_t ntohs(uint16_t netshort); htonl --- h(host) to n(network) l (long) //32位的数据 htons --- h(host) to n(network) s (short) //16位的数据 ntohs --- n(network) to h(host) s (short) 字符串转换函数 #include sys/socket.h #include netinet/in.h #include arpa/inet.h
主机转网络 in_addr_t inet_addr(const char *cp); inet_addr(192.168.1.20); cli.sin_addr 网络转主机char *inet_ntoa(struct in_addr in); //a -- ascii