共享内存、网络(day13)

一、共享内存
1、获取一个键值   ftok(3)
2、使用键值获取共享内存的id   shmget(2)
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
功能:分配一块共享内存段。获取和key值相关的共享内存段的id。
参数:
key:ftok(3)的返回值
size:指定了共享内存段的尺寸
shmflg:
IPC_CREAT:如果没有和key值相关的内存段,创建
IPC_EXCL:
mode: 指定共享内存段的权限
返回值:
成功返回共享内存段的id
失败 -1   errno被设置

编写代码创建一块共享内存段,获取该内存段的id
代码参见   shmget.c

3、将共享内存关联到进程的虚拟地址空间   shmat(2)
#include <sys/types.h>
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);
功能:将一块共享内存段添加到进程的地址空间
参数:
shmid:指定了共享内存段的id
shmaddr:NULL  有系统选择地址
shmflg:
SHM_RDONLY:共享内存段  只读
0
返回值:
返回共享内存段附加到进程的地址
错误  (void *) -1   errno被设置


4、向内存读写数据
5、解除进程的虚拟地址到共享内存的关联  shmdt(2)
int shmdt(const void *shmaddr);
功能:解除共享内存段和进程地址空间的关联
参数:
shmaddr:指定了共享内存段的起始地址
返回值:
成功  0
-1  错误  errno被设置

举例说明   使用共享内存段实现进程间的通讯 
代码参见   shmA.c  shmB.c

二、网络的基础知识

协议就是规则。
物理层协议    定义了电气规则
网帧   定义了网络传输的基本单位     链路层协议
(以太网、令牌环网)
在一个局域网里只允许出现一种网帧。

网络通讯中采用TCP/IP协议家族
TCP/IP 协议分为4层或者5层
物理层、链路层   网络层、传输层、应用层
链路层   网络层、传输层、应用层

ip 地址  192.168.1.12    逻辑地址   4G   40亿 
MAC地址  网卡的物理地址  6个字节    4G *64K
每块网卡都有自己的一个身份证。
如和查看本地的ip地址和mac地址
sudo ifconfig
  
windows 下 ipconfig /all

要实现通许,需要知道对方的ip地址和端口号
网络设备
集线器   hub   就是对电气的放大和分流   物理层 1层交换
交换机   交换的是网帧     链路层    2层交换
路由器   交换的是ip报文   网络层    3层交换

ip地址的分类
既然要做网络通讯,就必须知道ip地址的构成
ip地址是由网络号和主机号组成
那么我们就需要知道ip地址的主机号  网络号
如何获取一个ip地址的网络号?
需要使用子网掩码
192.168.1.130/25

192.168.1.130
255.255.255.128
192.168.1.128     网络号
127-2   125

192.168.1.125/25

192.168.1.125
255.255.255.128
192.168.1.0


192.168.1.125/24
192.168.1.130/24

局域网内数据的传送过程
如何查看本机的路由表?
sudo route -v

如何查看arp表?
sudo arp -a

如何知道两台机器是否互通?
ping 目标ip地址
172.30.3.93

总结:
一、system v IPC
共享内存
二、网络基础
子网掩码
三次握手
TCP/IP协议分层
原文地址:https://www.cnblogs.com/Kernel001/p/7732638.html