本文将介绍UNIX网络编程中connect
函数及其包裹函数。
函数简介
1 2 3 4 5
| #include<sys/socket.h> #include<sys/types.h>
int connect(int sockfd, const struct sockaddr* server_addr, socklen_t addrlen); 返回值:若成功返回0;若失败则返回-1.
|
connect
函数用于客户端建立tcp连接,发起三次握手过程。其中sockfd
标识了主动套接字,server_addr
是该套接字要连接的主机地址和端口号,addrlen
为server_addr
缓冲区的长度。
连接失败时,可以根据以下errno
值判断失败的原因:
1 2 3 4 5 6 7 8 9
| EBADF:参数sockfd 非合法socket处理代码; EFAULT:参数serv_addr指针指向无法存取的内存空间; ENOTSOCK:参数sockfd为一文件描述词,非socket; EISCONN:参数sockfd的socket已是连线状态; ECONNREFUSED:连线要求被server端拒绝; ETIMEDOUT:企图连线的操作超过限定时间仍未有响应; ENETUNREACH:无法传送数据包至指定的主机; EAFNOSUPPORT:sockaddr结构的sa_family不正确; EALREADY:socket为不可阻塞且先前的连线操作还未完成;
|
包裹函数(下载)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #include<sys/socket.h> #include<sys/types.h> #include<stdlib.h>
#define MAXSLEEP 128
int my_connect(int sockfd,const struct sockaddr *servaddr,socklen_t addrlen) { int nsec; for(nsec = 1;nsec <= MAXSLEEP;nsec <<= 1) { if(connect(sockfd,servaddr,addrlen) == 0) return 0; if(nsec <= MAXSLEEP/2) sleep(nsec); } return -1; }
|
包裹函数为connect
函数设置了超时重连的机制,如果连接成功,则成功返回。如果连接失败,则每次等待1、2、4、8。。。秒后继续尝试重新连接,直到MAXSLEEP
为止。