注册 登录
编程论坛 Linux教室

非阻塞connect()

madfrogme 发布于 2012-11-20 12:42, 1599 次点击
非阻塞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)


[ 本帖最后由 madfrogme 于 2012-11-20 13:50 编辑 ]
1 回复
#2
寒风中的细雨2012-11-27 22:06
UDP   connect  之后 类似么?
1