UNIX网络编程读书笔记:基本TCP套接口编程


 

编写一个完整的TCP客户和服务器程序所需要的基本套接口函数

参数family指明协议族(family),该参数也往往被称为协议域(domain)。所以有的书上声明如下:

AF_xxx与PF_xxx:

AF_前缀表地址族,PF_前缀表示协议族。历史上曾有这样的想法:单个协议族可以支持多个地址族,PF_值用来创建套接口,而AF_值用于套接口地址结构。但实际上,支持多个地址族的协议族从来就未实现过,而且头文件<sys/socket.h>中为一给定协议定义的PF_值总是与此协议的AF_值相等

若connect失败则该套接口不再可用,必须关闭,我们不能对这样的套接口再次调用connect函数。当循环调用函数connect尝试给定主机的各个IP地址直到有一个成功时,每次connect失败后,都必须close当前的套接口描述字,重新调用socket。

调用listen导致套接口从CLOSED状态转换到LISTEN状态。

(2)backlog参数规定了内核应该为相应套接口排队的最大连接个数。

为了理解其中的backlog参数,我们必须认识到内核为任何一个给定的监听套接口维护两个队列:

(1)未完成连接队列(incomplete connection queue),每个这样的SYN分节对应其中一项:已由客户发出并到达服务器,而服务器正在等待完成相应的TCP三路握手过程。这些套接口处于SYN_RCVD状态。

(2)已完成连接队列(completed connection queue),每个已完成TCP三路握手过程的客户对应其中一项。这些套接口处于ESTABLISHED状态。

监听套接口(listening socket)(由socket创建,随后用作bind和listen的第一个参数的描述字),称它的返回值为已连接套接口(connected socket)。区分这两个套接口非常重要。一个服务器通常仅仅创建一个监听套接口,它在服务器的生命期内一直存在。内核为每个由服务器进程接受的客户连接创建一个已连接套接口(也就是说对于它的TCP三路握手过程已经完成)。当服务器完成对于某个给定客户的服务时,相应的已连接套接口就被关闭。

本函数最多返回三个值:一个既可能是新套接口描述字也可能是出错指示的整数、客户进程的协议地址(由cliaddr指针所指)以及该地址的大小(由addrlen指针所指)。如果我们对返回客户协议地址不感兴趣,那么可以把cliaddr和addrlen均设置为空指针。

fork函数:http://www.cnblogs.com/nufangrensheng/p/3509492.html。

exec函数:http://www.cnblogs.com/nufangrensheng/p/3510821.html。

UNIX通常的close函数也用来关闭套接口,并终止TCP连接。

所有客户和服务器都从调用socket开始,它返回一个套接口描述字。客户随后调用connect,服务器则调用bind、listen和accept。套接口通常使用标准的close函数关闭。

image

相关内容