tcp/ip协议很久之前看过,现在忘得差不多了,补充一下tcp的三次握手和状态。
[img]http://dl2.iteye.com/upload/attachment/0127/6929/d85f79ac-2e6a-3f13-ae9d-5f21b18d8109.png[/img]
当对已经关闭的tcp套接字调用recv时,会返回-1,表示连接已经关闭,这是因为tcp有一个keep_alive的机制,相当于心跳连接,保证连接断开时,或者对方异常关闭时,自己能够马上知道,不会导致在recv上堵塞。
至于udp,因为没有状态,所以不会有keep_alive的机制,也无法第一时间得知对方已经关闭。
如何保证不会堵塞?第一种,比较常见就是配合select或epoll;第二种,使用较新的SO_RCVTIMEO和SO_SNDTIMEO套接字选项。
[img]http://dl2.iteye.com/upload/attachment/0127/6929/d85f79ac-2e6a-3f13-ae9d-5f21b18d8109.png[/img]
当对已经关闭的tcp套接字调用recv时,会返回-1,表示连接已经关闭,这是因为tcp有一个keep_alive的机制,相当于心跳连接,保证连接断开时,或者对方异常关闭时,自己能够马上知道,不会导致在recv上堵塞。
至于udp,因为没有状态,所以不会有keep_alive的机制,也无法第一时间得知对方已经关闭。
如何保证不会堵塞?第一种,比较常见就是配合select或epoll;第二种,使用较新的SO_RCVTIMEO和SO_SNDTIMEO套接字选项。