TCP客户用connect函数来建立与TCP服务器的连接
int connect (int sockfd, const sockaddr * servaddr, socklen_t addrlen);
sockfd是由socket函数返回的套接字描述符
servaddr指向套接字地址结构的指针
addrlen指向该结构的大小的指针
客户在调用函数connect 之前不必非要调用bind函数,因为如果需要的话,内核会确定源IP地址,并选择一个临时端口作为源端口
如果是TCP套接字,调用connect函数将会激发TCP的三次握手过程,而且仅仅在连接建立成功或出错时才返回,出错情况如下:
1)若TCP客户没有收到SYN分节的响应,则返回ETIMEOUT错误
2)若对客户的SYN的响应是RST(表示复位),则表明该服务器主机在我们指定的端口上没有进程在等待与之连接
这是一个硬错误,客户一接收到RST就马上返回ECONNREFUSED错误
产生RST的三个条件:
目的地为某端口的SYN到达,然而该端口上没有正在监听的服务器;
TCP想要取消一个已有连接;
TCP接受到一个根本不存在的链接上的分节。
3)若客户发出的SYN在中间的某个路由器上引发一个"destination unreachable"(目的地址不可达)ICMP错误,则认为是一种软错误
客户主机内核保存该消息,并按第一种情况中所述的时间间隔继续发送SYN,若在某个规定时间后仍然未收到相应,则把保存的消息(ICMP错误)作为EHOSTUNREACH或ENETUNREACH错误返回给进程