套接字(Socket)用于协调不一样计算机上的进程间通讯,也就是基于网络的通讯。固然,也能够在本机上使用套接字进行进程间的通讯。编程
套接字通讯的方式很是多,有Unix域套接字、TCP套接字、UDP套接字、链路层套接字等等。但最经常使用的确定是TCP套接字。因此,这里介绍下TCP Socket通讯方式,稍后再单独介绍Unix域套接字。网络
TCP Socket用于客户端、服务端的基于TCP协议的通讯,因此在客户端和服务端均须要建立一个套接字。建立TCP套接字时会返回这个套接字的文件描述符,可经过这个文件描述符对套接字进行读和写操做。socket
对比一下,当一个程序须要对一个磁盘文件同时进行读写操做(在命令行下彷佛没有找到这种命令,但经过编程方式是很容易实现的)时,因为只经过单个文件描述符同时负责读和写,极可能须要经过不断移动文件指针的方式来改变读写的位置,不然数据很容易错乱。操作系统
而TCP套接字也是经过单个文件描述符进行读写套接字的,为了保证读和写的位置不错乱,操做系统在内核空间为每一个TCP套接字维护了两个buffer空间,一个buffer用于写、一个buffer用于读。提供读的buffer空间称为recv buffer,提供写的buffer空间称为send buffer,它们统称为socket buffer。命令行
因此,服务端和客户端经过两个套接字通讯就简单了,一端向send buffer写数据,该buffer的数据会经过已经创建好的TCP链接发送到另外一端的recv buffer,因而另外一端只需从recv buffer中读数据便可实现不一样计算机上的进程间通讯。过程如图。unix
Unix域套接字是套接字的一种,用于本机进程间通讯,通常用来实现双向通讯的管道。Unix域套接字是比网络套接字轻量级且高效的多,由于它不涉及网络通讯,不须要监听链接,不须要绑定地址,不须要关心协议类型,等等。指针
建立Unix域套接字后返回两个文件描述符,这两个文件描述符均对套接字可读、可写,从而实现全双工的双向通讯。blog
一样的,为了不使用单个文件描述符同时读、写形成的数据错乱,Unix域套接字也有两个buffer空间。进程