connect函数
#include <sys/socket.h>
int connect(int sockfd,const struct sockaddr *servaddr,socklen_t addrlen);
返回:若成功则返回0,若出错返回-1
sockfd使用socket函数返回的套接字描述符,第二个,第三个分别是一个指向套接字地质结构的指针和该结构的大小。套接字地址结构必须包含有服务器的IP地址和端口号。
客户在调用函数connect前不必非得调用bind函数,因为如果需要的话,内核会确定源IP地址,并选择一个临时端口作为源端口。
如果是TCP套接字,调用connect函数将激发TCP的三路握手过程,而且仅在连接建立成功或出错时才返回。出错返回可能有以下几种情况:
1 > 若TCP客户没有收到SYN分节的相应,则返回ETIMEDOUT错误。
2 > 若对客户的SYN的响应时RST(表示复位),则表明该服务器主机在我们指定的端口上没有进程在等待链接。客户一收到RST就返回ECONNREFUSED错误
(
RST是TCP在发生错误时发送的一种TCP分节。产生RST的三个条件:
目的地址为某端口的SYN到达,然而该端口上没有正在坚挺的服务器;
TCP想取消一个已有的连接;
TCP接收到一个根本不存在的连接上的分节;
)
3 > 若对客户发出的SYN在中间的某个路由器上引发了一个“destination unreachable”(目的地址不可达)ICMP错误。客户主机内核保存该消息,并按时间间隔(6s后发,无响应等待24s后再发,若总共等等待了72s后任然无反应则返回错误)继续发送SYN。若规定时间内未收到响应,则把保存的消息作为EHOSTUNREACH或ENETUNREACH错误返回给进程。
若connect失败则该套接字不在可用,必须关闭,我们不能再对这样的套接字再调用connect函数。
浙公网安备 33010602011771号