Linux 环境进程间通信 六 套接口.doc
文本预览下载声明
Linux 环境进程间通信 六 套接口
简介:在本专题的前面几个部分,如消息队列、信号灯、共享内存等,都是基于Sys V的IPC机制进行讨论的,它们的应用局限在单一计算机内的进程间通信;基于BSD套接口不仅可以实现单机内的进程间通信,还可以实现不同计算机进程之间的通信。本文将主要介绍BSD套接口(sockets),以及基于套接口的重要而基本的API。
一个套接口可以看作是进程间通信的端点(endpoint),每个套接口的名字都是唯一的(唯一的含义是不言而喻的),其他进程可以发现、连接并且与之通信。通信域用来说明套接口通信的协议,不同的通信域有不同的通信协议以及套接口的地址结构等等,因此,创建一个套接口时,要指明它的通信域。比较常见的是unix域套接口(采用套接口机制实现单机内的进程间通信)及网际通信域。
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,将在后面给出。
下面是在网络编程中比较重要的几个数据结构,读者可以在后面介绍编程API部分再回过头来了解它们。
套接口是由socket数据结构代表的,形式如下:
struct socket socket_state state;/*指明套接口的连接状态,一个套接口的连接状态可以有以下几种
套接口是空闲的,还没有进行相应的端口及地址的绑定;还没有连接;正在连接中;已经连接;正在解除连接。*/
unsigned long flags;
struct proto_ops ops;/*指明可对套接口进行的各种操作*/
struct inode inode;/*指向sockfs文件系统中的相应inode*/
struct fasync_struct*fasync_list;/*Asynchronous wake up list*/
struct file*file;/*指向sockfs文件系统中的相应文件*/
struct sock sk;/*任何协议族都有其特定的套接口特性,该域就指向特定协议族的套接口对
象。*/
wait_queue_head_t wait;
short type;
unsigned char passcred;
};
由于历史的缘故,在bind、connect等系统调用中,特定于协议的套接口地址结构指针都要强制转换成该通用的套接口地址结构指针。结构形式如下:
struct sockaddr{
sa_family_t sa_family;/*address family,AF_xxx*/
char sa_data[14];/*14 bytes of protocol address*/
};
struct sockaddr_in __SOCKADDR_COMMON(sin_);/*描述协议族*/
in_port_t sin_port;/*端口号*/
struct in_addr sin_addr;/*因特网地址*/
/*Pad to size of`struct sockaddr.*/
unsigned char sin_zero[sizeof(struct sockaddr)-
__SOCKADDR_COMMON_SIZE-
sizeof(in_port_t)-
sizeof(struct in_addr)];
};
一般来说,读者最关心的是前三个域,即通信协议、端口号及地址。
int socket(int domain,int type,int ptotocol);
参数domain指明通信域,如PF_UNIX(unix域),PF_INET(IPv4),PF_INET6(IPv6)等;type指明通信类型,如SOCK_STREAM(面向连接方式)、SOCK_DGRAM(非面向连接方式)等。一般来说,参数protocol可设置为0,除
显示全部