int socket(int family,int type,int protocol);
参数说明:
family:AF_INET,AF_INET6,AF_ROUTE,AF_KEY,AF_LOCAL
type:SOCK_STREAM,SOCK_DGM,SOCK_SEQPACKET,SOCK_RAW
protocol:IPPROTO_TCP,IPPROTO_UDP,IPPROT_SCTP
功能说明:
进程中调用此函数后内核将完成socket套接字的文件描述符创建
in bind(int sockfd,const struct sockaddr *myaddr,socklen_t addrlen);
功能说明:
将服务器监听IP和端口等信息添加到socket描述符中,若未指定IP地址或端口系统内核将使用默认IP接收端口或一个临时端口号作为监听端口
int listen(int sockfd,int blackflog);
内核中工作原理:
1.内核创建创建已完成连接队列(ESTABLISHED)和未完成连接队列(SYN_RCVD),维护所有可以端对服务器端的请求;其中已
完成连接队列中存放已经完成客户端与服务器端三次握手请求的客户端请求信息。在三次握手完成之后,在服务器调用accept
之前客户端到达服务器端的数据,为队列为已连接套接字分配的接收数据缓存区中,接收的数据大小不能超过此缓存区的大小;
未完成连接队列中存放服务器端与客户端还未完成三次握手的连接套接字2.创建未完成连接队列将未完成服务器端与客户端的三次握手过程的套接字存放其中,直到完成为止
3.将完成三次握手过程的套接字从未完成队列转移到完成队列中(在三次握手正常完成的前提下,套接字在未完成队列中都存在一个RTT时间限制)
4.接收完成三次握手过程,且在为调用accept之间客户端发来的数据,数据大小小于分配的缓存区大小
int accept(int sockfd,sockadd *childAddr,socklen_t *addrlen);
功能说明:
从完成连接队列头部返回下一个已经完成的连接套接字,如果已完成连接队列为空,那么进程将进入睡眠状态(当套接字为阻塞方式时),直到有完成连接的套接字来到。
int close(int sockfd);
客服端:
int socket(int family,int type,int protocol);
int connect(int sockfd,const sockaddr *serveraddr,socklen_t addrlen);
返回错误说明:
1.三次握手中,服务器端未完成队列已经达到最大值,不允许客服端连入(调用connect时,客服端第一次发送SYN分节到服务器端进行连接请求,若此时服务器端未完成连接队列满时,服务器端将丢失客服端的SYN分节请求,客服端在6s后,未收到服务器端的SYN分节请求的回应,将再次发送一个SYN分节,若仍然无回应则等待24s后再次发送一个,若总共等75后未收到回应则返回ETIMEDOUT错误);
2.客服端在建立三次握手时发送的SYN分节中指定的服务器端地址在通过某个路由器时引发(distination unreachable)地址不可到达的ICMP错误(软错误soft error),当客服端收到路由器发回的此信息后内核将保存该信息,并按照第一种情况中所述的时间间隔发送SYN分节,若在规定的时间(BSD规定的75s)后仍未收到服务器端回应,则将内核保存的该信息(及ICMP错误)作为EHOSTUNREACH或ENETUNREACH错误返回给调用进程;
3.当客服端发送SYN分节请求连接时,若服务器未开启相应端口进行监听,服务器端将返回RST,并立即向进程返回ECONNREFUSED错误。产生RST错误的三个条件是:1.服务器端收到客服端对其某端口的请求,但是该端口未处于监听状态;2.TCP想取消一个已经连接的客服端请求;3.TCP接收到一个根本不存在的连接上的分节。
int close(int sockfd);