linux socket非阻塞之connect 函数

本文详细探讨了在Linux环境下,使用非阻塞模式的socket调用connect函数时的工作流程。在非阻塞模式下,connect会立即返回,并可能设置errno为EINPROGRESS。可以通过select函数检测连接状态,当套接字描述符变为可读或可写时,需进一步判断是连接成功还是出错。成功时,getsockopt获取的error值为0,而出现错误时,会返回相应的errno值,如ECONNREFUSED或ETIMEDOUT。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值