Linux 环境进程间通信(六):套接字2008-04-10 13:16在本专题的前面几个部分,如消息队列、信号灯、共享内存等,都是基于 Sys V 的 IPC 机制进行讨论的,它们的应用局限在单一计算机内的进程间通信;基于 BSD 套接口不仅可以实现单机内的进程间通信,还可以实现不同计算机进程之间 的通信。本文将主要介绍 BSD 套接口(sockets),以及基于套接口的重要而基本的 API。一个套接口可以看作是进程间 通信的端点(endpoint),每个套接口的名字都是唯一的(唯一的含义是不言而喻的),其他进程可以发现、连接并且与之通信。通信域用来说明套接口通 信的协议,不同的通信域有不同的通信协议以及套接口的地址结构等等,因此,创建一个套接口时,要指明它的通信域。比较常见的是 unix 域套接口(采用套接 口机制实现单机内的进程间通信)及网际通信域。1、背景知识linux 目前的网络内核代码主要基于伯克利的 BSD 的 unix 实现,整个结构采用的是一种面向对象的分层机制。层与层之间有严格的接口定义。这里我们引用[1]中的一个图表来描述 linux 支持的一些通信协议:我们这里只关心 IPS,即因特网协议族,也就是通常所说的 TCP/IP 网络。我们这里假设读者具有网络方面的一些背景知识,如了解网络的分层结构,通常所说的 7 层结构;了解 IP 地址以及路由的一些基本知识。目 前 linux 网络 API 是基于 BSD 套接口的(系统 V 提供基于流 I/O 子系统的用户接口,但是 linux 内核目前不支持流 I/O 子系统)。套接口可以说是 网络编程中一个非常重要的概念,linux 以文件的形式实现套接口,与套接口相应的文件属于 sockfs 特殊文件系统,创建一个套接口就是在 sockfs 中创建一个特殊文件,并建立起为实现套接口功能的相关数据结构。换句话说,对每一个新创建的 BSD 套接口,linux 内核都将在 sockfs 特殊文件系统 中创建一个新的inode。描述套接口的数据结构是 socket,将在后面给出。2、重要数据结构下面是在网络编程中比较重要的几个数据结构,读者可以在后面介绍编程 API部分再回过头来了解它们。(1)表示套接口的数据结构 struct socket套接口是由 socket 数据结构代表的,形式如下:struct socket{socket_state state; /* 指明套接口的连接状态,一个套接口的连接状态可以有以下几种套接口是空闲的,还没有进行相应的端口及地址的绑定;还没有连接;正在连接中;已经连接;正在解除...