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函数。

posted @ 2022-08-04 16:33  撒西不纳拉  阅读(366)  评论(0)    收藏  举报