《The Definitive Guide to Linux Network Programming》 (《Linux 网络编程指南》) Chapter 2

来源:互联网 发布:不想学英语知乎 编辑:程序博客网 时间:2024/04/27 22:36

套接字函数  


       大约20年前,美国高级计划研究署(ARPA)在加利福尼亚的伯克利学院成立了一个项目组,来研究TCP/IP协议在UNIX系统上实现的方法。其中一个重要的部分就是创建一个可以被应用程序调用的,基于TCP/IP协议的网络编程接口。该项目组认为如果有可能的话,这个接口应该使用现在已有的UNIX函数和算法,仅当现有的函数和算法实在不能满足要求时,才考虑新增实现函数。这个项目组所编写的网络编程接口就是现在我们所熟知的套接字接口。也被称为Berkeley socket interface,它最为人知的名字应该是BerkeleyUNIX 和 BSD UNIX。

       同期也有很多其他的网络编程接口,但BSD UNIX 已经成为事实上的标准了,而且被广泛的使用在了网络编程中。BSD是UNIX上的一个网络编程接口。

1.什么是套接字?

      简单的来讲,一个套接字就是一个对网络通信的抽象,就好想文件只是文件系统通信的一个抽象一样。我们不妨把基本的网络I/O操作函数,看成一个UNIX操作系统。通常来说一个应用程序如果想要进行网络I/O操作的话,只需要以下几个函数即可:

      1)Open():为输入输出做好准备;

      2)Close():停止所有之前的操作,收回分配的资源;

      3) Read():读取数据并写入应用程序的内存中;

      4)Write():从应用程序内存中获取数据写入文件或发送控制信息;

      5)Control(): 设置诸如缓冲区大小及两个通信程序的连接

       一个单机程序的I/O操作是在文件中进行的。其步骤如下:打开一个文件,将数据读取或写入文件中(或者读写),关闭文件。

些函数都需要一个叫做文件描述符(file description)来完成操作。文件描述符是一个整型变量指针,由函数返回,后面所有对文

的操作都需要这个文件描述符。系统会为每一个进程维护一个文件描述符表,当进程需要打开一个文件时,一个指向文件数据的

针会被储存到文件描述符表中,指针的索引会被返回给调用进程。应用进程仅仅只需要操作文件描述符就行,无需知道更多的底

实现;接下来的操作就由操作系统来完成,操作系统会根据返回的存储在文件描述符表中的指针来获取应用进程想要获取的信

息。因此,当一个文件被打开时,一个文件描述符会被返回,其他函数就可以通过这个文件描述符对文件进行读取、写入、改变文

件选项以及在所有操作结束时关闭文件。

          伯克利套接字(BSD)的套接字描述符,即是对文件描述符这一概念的继承和扩充。和文件一样,一个活动的套接字由一个套

接字描述符来定义,而这里的套接字描述符也是一个整型变量。和文件描述符一样,它们也是由进程创建,然后储存在系统维护的

描述符表中。注意,一个应用程序的文件描述符和套接字描述符的值不能相同。

        接下来我们继续对文件的分析。当一个程序要创建一个文件或者操作一个已经存在的文件时,系统将会分配一个对应的文件描

述符。这个文件描述符是一个指针,它指向一个储存文件基本信息的数据结构。这个数据结构可能包含:文件名、文件在磁盘中的

实际储存地址、文件是只读还是读写皆可以及文件的大小。同样的,当一个程序要创建一个新的套接字或者操作一个已经存在的套

接字时,一个对应的套接字描述符将会创建。这个套接字描述符也是一个指针,它指向一个储存了套接字信息的数据结构。这些套

接字信息和文件的类似,当然有一点不同的是:他们是面向网络的。套接字的数据结构储存了,套接字的类型,本地IP地址、绑定

的端口。以及我们即将要进行通信的远程套接字的IP地址和其绑定的端口。这些信息,有些可以立马获取到,有些则需要调用后见

面的函数来获取。

        通过对文件描述符的概念的扩展,UCBerkeley 团队使得网络可视化通信变得简单起来。为了进行网络通信,一个网络连接

(socket)必须事先打开,一但它打开了,我们就可以向它读写数据了。当通信结束时,这个连接就会被关闭,分配给套接字的系

统资源也将会回收。

         一个成功创建的套接字,既可以用来监听一个网络连接申请,也可以用来申请连接一个远程的套接字或者本机的另一个套接。

字。客户端用于主动建立一个连接的套接字称为:主动套接字;服务端用于监听连接请求的套接字称为被动套接字。无论是主动套

接字,还是被动套接字,他们创建 的方式都是一样的,只是网络程序使用他们的方式不同罢了。

 

                                                                                                                                                  未完待续...

                                                                    ps:本文翻译比较粗糙,仅供参考,有条件的同学推荐阅读原著,不足之处,望大神指正。

 

 

                                                                                                               

 


0 0