1.
如何判断socket已经断开 在server端会使用专门的线程处理一条socket连接。如果socket连接断开(异常,正常)后,如何才能感知到?server端这边是绝对被动的,sever端不能主动断开连接。也没有连接链路维持包之类的。client端发送数据的时间也是不定的。在
socket连接断开后, server要能够感知到并释放资源。
当使用 select()函数测试一个socket是否可读时,如果select()函数返回值为1,且使用recv()函数读取的数据长度为0 时,就说明该socket已经断开。
为了更好的判定socket是否断开,判断当recv()返回值小于等于0时,socket连接断开。但是还需要判断 errno是否等于 EINTR
。如果errno == EINTR
则说明recv函数是由于程序接收到信号后返回的,socket连接还是正常的,不应close掉socket连接。
PS:对于堵塞socket的recv函数会在以下三种情况下返回:
(1)recv到数据时,会返回。
(2)在整个程序接收到信号时,返回-1。
errno = EINTR。//在程序的起始阶段,屏蔽掉信号的除外。部分信号还是屏蔽不掉的。
(3)socket出现问题时,返回-1.具体错误码看 man recv()
(4)一定要看 man 说明,很详细,很有帮助。
posted on 2009-12-17 23:14
chatler 阅读(244)
评论(0) 编辑 收藏 引用 所属分类:
Socket