天天看点

Unix Network Programming(10)---connect 函数

TCP客户用connect函数来建立与TCP服务器的连接。

#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);    /*返回:若成功则为0,若出错则为-1*/
           

函数解析:sockfd是由socket函数返回的套接字描述符,第二个和第三个参数分别为一个指向套接字地址结构的的指针和该结构的大小。套接字地址结构必须含有服务器的IP地址和端口号。

如果是TCP套接字,调用connect函数将激发TCP的三路握手过程,而且尽在连接建立成功或出错时才返回:

  1. 若TCP客户没有收到SYN分节的响应,则返回ETIMEDOUT错误。
  2. 若对客户的SYN响应是RST(表示复位),则表明该服务器主机在我们指定的端口上没有进程在等待与之连接(例如服务器进程也许没有正在运行)。硬错误(hard error),客户一接受到RST就马上返回ECONNREFUSED错误。

    RST:在TCP发生错误时发送的一种TCP分节,三个条件:目的地为某端口的SYN到达,然而该端口上没有正在监听的服务器;TCP想取消一个已有连接;TCP接收到一个根本不存在的连接上的分节。

  3. 客户发出SYN在中间某个路由器引发“destination enreachable”的ICMP错误,则认为是一种“软错误(soft error)”。客户内核保存该消息,并按一定间隔进行重传,若在某个规定时间内仍未收到响应,则把保存的信息(ICMP错误)作为EHOSTUNREACH或ENETUNREACH错误返回给进程。