标题:
非阻塞connect()
[打印本页]
作者:
yuyang911220
时间:
2017-6-17 10:38
标题:
非阻塞connect()
非阻塞connect()
当一个TCP连接被设定为nonblocking, 然后调用connect(),
这时connect() 会立即返回一个错误,EINPROGRESS.
但TCP三握手还会继续进行。
我们通过使用select() 来检查连接的建立有没有完成。
因为connect()需要花一个RTT的时间来完成,
所以这个时间里我们还想要做其它事情。
我们也可以用这个技巧同时建立多个连接,比如浏览器。
connect()的timeout 是75秒或几分钟,
因为我们使用select()来确认连接的建立, 我们就可以
给select() 设定一个时间限制。
对TCP来说, 当send buffer 中的
free space 小于 2048时,socket则不可写
当连接建立后, descriptor变成可写
程序代码:
#define sowriteable(so) \
(sbspace(&so)->so_snd) >= (so)->so_snd.sb_lowat && \
(((so)->so_state & SS_ISCONNECTED) || \
((so)->so_proto->pr_flags& PR_CONNREQUIRED) == 0) || \
((so)->so_state & SS_CANTSENDMORE) || \
(so)->so_error)
当连接的建立遇到错误时, descriptor 变成可读又可写
程序代码:
#define soreadable(so) \
((so)->so_rcv.sb_cc >= (so)->so_rcv.sb_lowat || \
((so)->so_state & SS_CANTRCVMORE) || \
(so)->so_qlen || (so)->so_error)
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0