非阻塞connect卡select问题分析

本文探讨了非阻塞connect配合select实现高效网络连接的方法,分析了connect原理、select工作方式及多线程环境下可能产生的问题,并给出了相应的优化建议。

非阻塞connect卡select问题分析

目录

非阻塞connect卡select问题分析

一、connect原理

1.1阻塞与非阻塞connect的区别

1.2 connect函数超时时间

二、select原理

三、问题原因

4.1 select的第四个参数建议加上。

4.2 select的第五个参数timeout的大小建议。

4.3 fd的多线程操作


一、connect原理

1.1阻塞与非阻塞connect的区别

为解决阻塞connect等待耗时过长,最长等待127秒问题,企业级开发长采用非阻塞connect加select方式进行连接,达到连接时间更短,连接时间可设置的目的。

connect主要使用套接字建立到指定网络地址的socket连接。套接字执行connect操作有两种模式,分别是阻塞和非阻塞。阻塞模式下,在连接建立完成之前,connect一直等待;在非阻塞模式下,connect会立即返回,不会等待连接建立,这种模式下,如果errno为EINPROGRESS,此时三次握手仍在继续,需要调用select检测非阻塞connect是否完成。Select阻塞时间可以比connect超时时间短,防止连接线程长时间阻塞在connect函数处。

阻塞与非阻塞connect调用区别如图所示。

 

在建立连接时,通过sock_sndtimeo函数,如果套接字标志位含O_NONBLOCK标志,也就是开启了非阻塞模式,sock_sndtimeo函数返回0,反之返回sk->sk_sndtimeo,表示connect超时时间。

sock_sndtimeo返回后做if (!timeo || !inet_wait_for_connect(sk, timeo, writebias))判定。当是非阻塞模式,timeo为0,if直接退出。而当是阻塞模式,timeo是超时时间,!time就是0,此时执行inet_wait_for_connect函数。

inet_wait_for_connect函数中有个循环,等待连接,只有连接建立状态不为(TCPF_SYN_SENT | TCPF_SYN_RECV),或者收到信号,后者超时,timeo变为0,while循环才会退出。

超时时间sk_sndtimeo可以通过setsockopt进行设置。

 

1.2 connect函数超时时间

Connect函数调用tcp_transmit_skb发送SYN包后,通过inet_csk_reset_xmit_timer函数设置超时定时器。如果对端一直不发送SYN_ACK,将会返回-ETIMEDOUT。重传的超时时间跟net.ipv4.tcp_syn_retries有关,默认值是6。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值