Board logo

标题: 非阻塞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