首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

非阻塞connect()

非阻塞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)
继承事业,薪火相传
返回列表