connect函数

时间:2022-05-07 16:47:08

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错误返回给进程