欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

每天3分钟操作系统修炼秘籍(17):进程间通信(3):套接字

程序员文章站 2022-08-19 22:03:08
"点我查看秘籍连载" 套接字 套接字(Socket)用于协调不同计算机上的进程间通信,也就是基于网络的通信。当然,也可以在本机上使用套接字进行进程间的通信。 套接字通信的方式非常多,有Unix域套接字、TCP套接字、UDP套接字、链路层套接字等等。但最常用的肯定是TCP套接字。所以,这里介绍下TCP ......

套接字

套接字(socket)用于协调不同计算机上的进程间通信,也就是基于网络的通信。当然,也可以在本机上使用套接字进行进程间的通信。

套接字通信的方式非常多,有unix域套接字、tcp套接字、udp套接字、链路层套接字等等。但最常用的肯定是tcp套接字。所以,这里介绍下tcp socket通信方式,稍后再单独介绍unix域套接字。

tcp socket用于客户端、服务端的基于tcp协议的通信,所以在客户端和服务端均需要创建一个套接字。创建tcp套接字时会返回这个套接字的文件描述符,可通过这个文件描述符对套接字进行读和写操作。

对比一下,当一个程序需要对一个磁盘文件同时进行读写操作(在命令行下似乎没有找到这种命令,但通过编程方式是很容易实现的)时,由于只通过单个文件描述符同时负责读和写,很可能需要通过不断移动文件指针的方式来改变读写的位置,否则数据很容易错乱。

而tcp套接字也是通过单个文件描述符进行读写套接字的,为了保证读和写的位置不错乱,操作系统在内核空间为每个tcp套接字维护了两个buffer空间,一个buffer用于写、一个buffer用于读。提供读的buffer空间称为recv buffer,提供写的buffer空间称为send buffer,它们统称为socket buffer

所以,服务端和客户端通过两个套接字通信就简单了,一端向send buffer写数据,该buffer的数据会通过已经建立好的tcp连接发送到另一端的recv buffer,于是另一端只需从recv buffer中读数据即可实现不同计算机上的进程间通信。过程如图。

每天3分钟操作系统修炼秘籍(17):进程间通信(3):套接字

unix域套接字

unix域套接字是套接字的一种,用于本机进程间通信,一般用来实现双向通信的管道。unix域套接字是比网络套接字轻量级且高效的多,因为它不涉及网络通信,不需要监听连接,不需要绑定地址,不需要关心协议类型,等等。

创建unix域套接字后返回两个文件描述符,这两个文件描述符均对套接字可读、可写,从而实现全双工的双向通信。

同样的,为了避免使用单个文件描述符同时读、写造成的数据错乱,unix域套接字也有两个buffer空间。

每天3分钟操作系统修炼秘籍(17):进程间通信(3):套接字