非阻塞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)
[ 本帖最后由 madfrogme 于 2012-11-20 13:50 编辑 ]