一、共享内存(最高效的进程间通信方式)
1.是一块内核预留的空间,避免了用户空间到内核空间的数据拷贝。
2.IPC对象操作通用框架:
0x ftok
key值 == >申请 == 》读写 == 》关闭 == 》卸载
(1) ftok
ftok
函数用于生成一个唯一的IPC键(key),通常用于创建共享内存、消息队列或信号量等。
原型
key_t ftok(const char *pathname, int proj_id);
参数
pathname
: 指向一个文件路径的字符串,这个文件用于生成唯一的键。proj_id
: 一个项目标识符,通常是一个字符,结合pathname
生成唯一键。
返回值
- 成功时返回一个唯一的IPC键;失败时返回
-1
,并设置errno
。
(2)shmget
函数用于创建一个共享内存段或获取一个已存在的共享内存段的标识符。
原型
int shmget(key_t key, size_t size, int shmflg);
参数
key
: 由ftok
生成的 IPC 键。size
: 请求的共享内存大小(以字节为单位)。shmflg
: 操作标志,例如权限、创建标志等。
返回值
- 成功时返回共享内存段的标识符;失败时返回
-1
,并设置errno
。
(3) shmat
shmat
函数用于将共享内存段附加到调用进程的地址空间。
原型
void *shmat(int shmid, const void *shmaddr, int shmflg);
参数
shmid
: 通过shmget
获取的共享内存段标识符。shmaddr
: 首选的附加地址(通常设为NULL
,让系统选择地址)。shmflg
: 附加标志,通常为 0。
返回值
- 成功时返回共享内存段的地址;失败时返回
(void *) -1
,并设置errno
。
(4) shmdt
shmdt
函数用于将共享内存段从调用进程的地址空间分离。
原型
int shmdt(const void *shmaddr);
参数
shmaddr
: 先前通过shmat
返回的共享内存段地址。
返回值
- 成功时返回 0;失败时返回
-1
,并设置errno
。
(5)shmctl
shmctl
函数用于控制共享内存段的属性。
原型
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
参数
shmid
: 通过shmget
获取的共享内存段标识符。cmd
: 控制命令,例如IPC_STAT
(获取共享内存段状态)和IPC_RMID
(删除共享内存段)。buf
: 指向shmid_ds
结构的指针,用于获取或设置共享内存段的属性(根据cmd
的值)。
返回值
- 成功时返回 0;失败时返回
-1
,并设置errno
。
示例
二、网络(不同主机间的通信)
IP:用来标识一台主机;
-
IPv4地址:由四个以点分隔的十进制数字组成,每个数字的范围是0到255,例如:192.168.1.1。由于IPv4地址的数量有限,已经无法满足全球设备的需求。
-
IPv6地址:为了解决IPv4地址耗尽的问题,IPv6引入了更大的地址空间。IPv6地址由八组四位十六进制数构成,以冒号分隔,例如:2001:0db8:85a3:0000:0000:8a2e:0370:7334。
网络号 + 主机号
端口号:用来表示主机中某一具体(进行网络通信)的进程
1.osi参考七层模型
(1)物理层
(2)数据链路层
(3)网络层
(4)传输层(传输控制层)
(5)会话层
(6)表示层
(7)应用层:直接获取要收发的数据
实际应用的为TCP/IP模型
三、tcp / udp
1. TCP(即传输控制协议):是一种面向连接的传输层协议,它能提供高可靠性通作(即数
据无误、数据无丢失、数据无失序、数据无重复到达的通信)
*适用情况:
(1) 适合于对传输质量要求较高,以及传输大量数据
的通信。
(2) 在需要可靠数据传输的场合,通常使用TCP协议
(3)MSN/QQ等即时通讯软件的用户登录账户管理相关
的功能通常采用TCP协议
tcp协议特点:
(1) 面向连接
(2)可靠传输
(3)面向字节流程
2. UDP(Tser Datagram Protocol)用户数据报协议,是不可靠的无连接的协议。
在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输。
* 适用情况:
(1)发送小尺寸数据(如对DNS服务器进行IP地址查询时)
(2)在接收到数据,给出应答较困难的网络中使用UDP。(如:无
线网络)
(3)适合于广播/组播式通信中。
(4)MSN/QQ/Skype等即时通讯软件的点对点文本通讯以及音视频通
讯通常采用UDP协议
(5)流媒体、VOD、VoIP、IPTV等网络多媒体服务中通常采用UDP
方式进行实时数据传输
UDP特点:
(1)不可靠
(2)无连接
(3)数据报
3.网络编程实现
(1)编程模型
c/s client server 客户端,服务器模型 专用客户端
b/s browser server 浏览器,服务器模型 通用的客户端
p2p peer to peer 点对点传输
(2)
(1)socket
int socket (int domain, int type, int protocol) ;
功能:程序向内核提出创建一个基于内存的套接字描述符
函数参数
-
domain:
- 指定所使用的地址族 (Address Family),常用的值有:
AF_INET
: IPv4 Internet协议。AF_INET6
: IPv6 Internet协议。AF_UNIX
: 本地通信(进程间通信,IPC)。
- 指定所使用的地址族 (Address Family),常用的值有:
-
type:
- 指定 Socket 的类型,常用的值有:
SOCK_STREAM
: 面向连接的 TCP Socket。SOCK_DGRAM
: 无连接的 UDP Socket。SOCK_RAW
: 原始 Socket,用于接收和发送任意协议的网络数据。
- 指定 Socket 的类型,常用的值有:
-
protocol:
- 通常为 0,表示使用默认的协议。根据
domain
和type
来选择合适的协议。例如:- 对于
SOCK_STREAM
,可以指定IPPROTO_TCP
。 - 对于
SOCK_DGRAM
,可以指定IPPROTO_UDP
。
- 对于
- 通常为 0,表示使用默认的协议。根据
返回值
- 成功时,返回一个 Socket 描述符(int 类型),可以用来引用该 Socket。
- 失败时,返回
-1
,并设置相应的错误代码(可以通过errno
获取)。
(2)sendto
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
参数说明
-
sockfd:
- 要发送数据的 Socket 描述符,通常是通过
socket
函数创建的。
- 要发送数据的 Socket 描述符,通常是通过
-
buf:
- 指向要发送的数据的缓冲区的指针。
-
len:
- 发送数据的字节数,通常是
buf
中有效数据的大小。
- 发送数据的字节数,通常是
-
flags:
- 发送时的标志,通常为 0。可以设置一些特定的标志,例如
MSG_DONTWAIT
等,但大多数情况下不会用到。
- 发送时的标志,通常为 0。可以设置一些特定的标志,例如
-
dest_addr:
- 指向目标地址的结构体指针,通常是一个
sockaddr_in
结构体,用于指定目标主机的 IP 地址和端口。
- 指向目标地址的结构体指针,通常是一个
-
addrlen:
dest_addr
结构体的大小。可以使用sizeof(struct sockaddr_in)
来获取。
返回值
- 成功时,返回实际发送的字节数。
- 失败时,返回
-1
,并设置相应的错误代码(可以通过errno
获取)。
(1)htons:用于将一个短整数(16位,无符号整数)从主机字节顺序转换为网络字节顺序。网络字节顺序(big-endian)用于在网络上传输数据,确保不同主机之间的数据可以正确解析。
(2)inet_addr:是一个用于将 IPv4 地址的字符串表示法转换为网络字节顺序的二进制格式的函数。这个函数通常用于网络编程中,尤其是在与套接字(sockets)相关的应用中,以指定一个目的地 IP 地址。
示例: