1,connect原型
#include<sys/socket.h>
int connect (int sockfd, const struct sockaddr * servaddr, int addrlen);
如果是TCP套接字,connect函数将激发TCP 的三路握手。
阻塞模式下:(阻塞中)
- = 0 连接成功
- = -1 出错(有ETIMEDOUT,超时;ECONNREFUSED,服务器进程没运行;EHOSTUNREACH,目的不可达)
非阻塞模式下:(立即返回)
- = 0 连接成功
- = -1 还需要判断error是否是EINPROGRESS(表示进程正在处理),否则失败
因为非阻塞模式,调用connect()后函数立即返回,如果连接不能马上建立成功(返回-1),则errno设置为EINPROGRESS,此时TCP三次握手仍在继续。此时可以调用select()检测非阻塞connect是否完成。select指定的超时时间可以比connect的超时时间短,因此可以防止连接线程长时间阻塞在connect处。
select