TCP/IP编程之connect函数详解


函数原型:

CONNECT(2)                 Linux Programmer's Manual                CONNECT(2)

NAME
       connect - initiate a connection on a socket

SYNOPSIS
       #include           /* See NOTES */
       #include 

       int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);



参数说明:

sockfd是由socket函数返回的套接字描述符,第二个、第三个参数分别是一个指向套接字地址结构的指针和结构的大小。


返回值:

返回:若成功则为0,若出错则为-1


关于bind函数:

客户端在调用connect前不必非得调用bind函数,因为如果需要的话,内核会确认源IP地址,并选择一个临时端口作为源端口,通常我们都不会在客户端调用bind函数。


调用connect函数将会激发TCP/IP的三路握手过程,而且仅在连接建立成功或出错时餐返回,其中出错返回可能有以下几种情况:

(1)  若TCP客户端没有收到SYN分节的响应,则返回ETIMEDOUT错误。举例说,调用connect函数时,4.4BSD内核发送一个SYN,若无响应则等待6s后再发送一个,若仍无响应则等待24s再发送一个。若总共等了75s后仍未收到响应则返回本错误。(注:sockfd默认是阻塞模式,非阻塞模式请参考文章:socket超时详解)


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

  注:RST错误是TCP在发生错误时发送的一种TCP分节。产生RST的三个条件是:

(a)目的地为某端口的SYN抵达,然而该端口上没有监听的服务器。

(b)TCP想取消一个已有连接。

(c)TCP接收到一个根本不存在的连接上的分节。


(3) 若客户端发出的SYN在中间的某个路由器上引发了一个“destination unreachable”(目的地不可达)ICMP错误,则认为是一种软错误。客户端主机内核保存该消息,并按第一种情况中所述的时间间隔继续发送SYN。若在规定的时间后仍未收到响应,则把保存的消息作为EHOSTUNREACH或ENETUNREACH错误返回给客户端。以下两种情况也是有可能的:一是按照本地系统的转发表,根本没有达到远程系统的路径;二是connect调用根本不等待就返回。


IPv4的TCP伪代码如下:

int sockfd = socket(AF_INET, SOCK_STREAM, 0); //TCP

short port = 9527; //服务器端口
struct sockaddr_in servaddr;
servaddr.sin_family = AF_INET; //IPv4
servaddr.sin_addr.s_addr = inet_addr("192.168.1.101"); //服务器地址
servaddr.sin_port = htons(port);

int res = connect(sockfd, (sockaddr *)&servaddr, sizeof(sockaddr_in));



参考:《unix网络编程》·卷1






你可能感兴趣的:(TCP/IP,TCP/IP)