非阻塞 connect套接字

非阻塞connect套接字允许在等待连接建立时执行其他任务,提高效率。它能立即返回EINPROGRESS并继续TCP三次握手。实现中需注意连接同一主机的处理,以及遵循POSIX的select规则。通过fcntl设置非阻塞,使用select监控可读可写状态,处理超时和错误,最后通过getsockopt检查连接结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

非阻塞connect套接字的作用:
1)完成一个connect要花费RTT时间,而RTT波动范围很大,从局域网上的几个毫秒甚至是广域网上的几秒,这段时间也许有我们要执行的其他处理工作可以执行。
2)可以使用这个技术同事建立多个连接。
3)许多connect的超时实现以75秒为默认值,如果应用程序想自定义一个超时时间,就是使用非阻塞的connect.

在一个非阻塞的套接字上调用connect,connect会立即返回EINPROGRESS,错误,但是已经发起的TCP三次握手继续进行。

非阻塞connect套接字实现时需要注意的细节:
1)连接到同一主机上,connect会立即完成,我们必须处理这种情形
2)POSIX关于select和非阻塞connect的以下两个规则:
1)连接成功,描述符会变成可写
2)连接建立遇到错误时,描述符变为可读可写。

非阻塞connect实现流程:
一:
1)调用fcntl把套接字设置为非阻塞
2)调用connect,如果返回0,表示连接已经完成,如果返回-1,那么期望收到的错误是EINPROGRESS,连接建立已经 启动,但是尚未完成。

二:调用select,等待套接字变为可读可写,

三:处理超时:
如果select返回0,超时发生,那么返回ETIMEOUT错误给调用者,并且关闭套接字,防止已经启动的三路握手继续下去。

四:检查可读或可写条件:
如果描述符变为可读或可写,我们就调用getsockopt获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值