socket 描述符(经典)

来源:互联网 发布:难吃的瓜子 知乎 编辑:程序博客网 时间:2024/05/29 12:39

2011-03-08 20:30

dlytgaowen 的 套接字描述符

引子........

大多数的操作系统里,需要I/O请求的应用程序请求操作系统打开一个文件。系统就创建一个文件描述符提供给应用程序访问文件。从应用程序的角度看,文件描述符是一个整数,应用程序可以用它来读写文件。下图显示,操作系统如何把文件描述符实现为一个指针数组,这些指针指向内部数据结构。

对于每个程序系统都有一张单独的表。精确地讲,系统为每个运行的进程维护一张单独的文件描述符表。当进程打开一个文件时,系统把一个指向此文件内部数据结构的指针写入文件描述符表,并把该表的索引值返回给调用者 。应用程序只需记住这个描述符,并在以后操作该文件时使用它。操作系统把该描述符作为索引访问进程描述符表,通过指针找到保存该文件所有的信息的数据结构。

正题......

套接字接口为网络通信增加了一个新的抽象,即套接字。和文件一样,每个活动的套接字都有一个整数来标识,我们将其称为套接字描述符。Windows操作系统为每个进程维护一个单独的套接字描述符表。因此,应用程序可以拥有相同的文件描述符和套接字描述符。

套接字API里有个函数socket,它就是用来创建一个套接字。套接字设计的总体思路是,单个系统调用就可以创建任何套接字,因为套接字是相当笼统的。一旦套接字创建后,应用程序还需要调用其他函数来指定具体细节。

了解套接字这个抽象概念的最简单的方法是想象一下操作系统中的数据结构。当应用程序调用socket后,操作系统分配一个新的数据结构来保存通信所需的信息,并在进程套接字描述符表内增加一个条目,存储指向这个数据结构的指针。下图显示了调用socket后的进程套接字描述符表。这里socket调用的参数指定了协议族为PF_INET,服务类型为SOCK_STREAM。

虽然套接字的内部数据结构包含很多字段,但是系统创建套接字后,大多数字字段没有填写。应用程序创建套接字后在该套接字可以使用之前,必须调用其他的过程来填充这些字段。