什么是套接字描述符?(socket描述符)
套接字描述符是一个整数类型的值。每个进程的进程空间里都有一个套接字描述符表,该表中存放着套接字描述符和套接字数据结构的对应关系。该表中有一个字段存放新创建的套接字的描述符,另一个字段存放套接字数据结构的地址,因此根据套接字描述符就可以找到其对应的套接字数据结构。每个进程在自己的进程空间里都有一个套接字描述符表但是套接字数据结构都是在操作系统的内核缓冲里。
-------------------------------------------------------
套接字接口为网络通信增加了一个新的抽象,即套接字。和文件一样,每个活动的套接字都有一个整数来标识,我们将其称为套接字描述符。Windows操作系统为每个进程维护一个单独的套接字描述符表。因此,应用程序可以拥有相同的文件描述符和套接字描述符。
套接字API里有个函数socket,它就是用来创建一个套接字。套接字设计的总体思路是,单个系统调用就可以创建任何套接字,因为套接字是相当笼统的。一旦套接字创建后,应用程序还需要调用其他函数来指定具体细节。
了解套接字这个抽象概念的最简单的方法是想象一下操作系统中的数据结构。当应用程序调用socket后,操作系统分配一个新的数据结构来保存通信所需的信息,并在进程套接字描述符表内增加一个条目,存储指向这个数据结构的指针。下图显示了调用socket后的进程套接字描述符表。这里socket调用的参数指定了协议族为PF_INET,服务类型为SOCK_STREAM。
虽然套接字的内部数据结构包含很多字段,但是系统创建套接字后,大多数字字段没有填写。应用程序创建套接字后在该套接字可以使用之前,必须调用其他的过程来填充这些字段。