TCP套接字编程函数的理解

socket函数

作用:创建一个套接字(可以是TCP的,也可以是其他协议的,取决于socket的参数),返回一个标志该套接字的套接字描述符。

关键:所创建的套接字并不含有IP和端口号。可以认为,socket创建的套接字是空的,需要其他函数往里面填写IP和端口号等信息。

使用方:客户端和服务器端都要使用。

connect函数

作用:与TCP服务器端建立连接。

适用方:客户端。

关键1:参数依次是:客户端套接字、服务器端套接字地址结构的指针。

关键2:参见上图,客户端没有使用bind函数而直接调用connect。此时connect使用的套接字还是通过socket新建的,没有填充本地的IP和端口号。因为,内核会确定该IP和端口号。

bind函数

作用:往socket函数创建的套接字中填写IP和端口号等信息。 

使用方:二者都可。

关键:bind函数可以选择部分填充IP和端口号,甚至什么都不填。

listen函数

作用:当socket函数创建一个套接字时,它被假设为一个 主动套接字。也就是说,它是一个将调用connect的客户端套接字。listen函数负责把还未连接的主动套接字转换成被动套接字,并指示内核应接受向该套接字的连接请求。

关键:listen函数转换后的套接字称为 ” 监听套接字 ” 。客户端发送SYN分节到该套接字请求连接,连接未建立时,该连接处于未连接队列。连接建立成功后(完成三次握手),连接处于已完成连接队列,等待被accept提取。

accept函数

作用:从已完成连接队列中提取一个连接。重点是提取对端的套接字地址结构。

关键:accept返回值是一个 “ 已连接套接字 “ 描述符。

 

getsockname和getpeername函数

作用:分别获取本地和对端的套接字地址结构。

总结要点:

1. socket创建一个空的套接字,bind负责往该套接字中填充IP和端口号等内容。倘若不使用bind函数,一般内核会自动填写IP并分配端口号。

2. 监听套接字:只含有服务端的IP和端口号。

    已连接套接字: 含有这个连接的完整信息。即同时含有服务端和客户端的IP和端口号。

3. accept函数可以在connect之前,也可在之后,甚至可以在数据开始传输之后。