如何判断socket已经断开
来源:互联网 发布:知乎 知乎日报 区别 编辑:程序博客网 时间:2024/05/07 22:01
最近在做一个服务器端程序,C/S结构。功能方面比较简单就是client端与server端建立连接,然后发送消息给server。我在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 说明,很详细,很有帮助。
这种方法经过长时间测试后,是有效的。所以写出来让大家参考一下,请大家发表意见。
这个问题在思考测试,询问同事之后,找到了一个方法,可以做到这一点。
当使用 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 说明,很详细,很有帮助。
这种方法经过长时间测试后,是有效的。所以写出来让大家参考一下,请大家发表意见。
- 如何判断socket已经断开
- 如何判断socket已经断开
- 如何判断SOCKET已经断开
- 如何判断socket已经断开
- 如何判断socket已经断开
- Java如何判断socket是否已经断开
- 如何判断一个SOCKET连接是否已经断开
- 如何判断一个SOCKET连接是否已经断开
- 【VS开发】如何判断客户端SOCKET已经断开连接?
- 如何判断一个SOCKET连接是否已经断开
- java 怎么判断socket已经断开
- C 判断socket 是否已经断开
- 如何判断socket客户端断开
- 如何判断Socket是否断开
- 如何判断Socket是否断开
- 如何判断一个tcp连接已经断开
- 如何判断socket是否已经断开和防止外部攻击,只连接不传输数据
- Javaclient端怎么判断server端socket是否已经断开
- QClub:开源世界里谁需要标准?(12.13 北京)
- Struts2权限控制拦截器
- 代理模式(Proxy)
- SQL Server 中的触发器使用
- SpringSide 2.0使用方法简介
- 如何判断socket已经断开
- 为AND和OR函数找替身
- (转载)如何配置VMware中Linux系统网络
- 从小到大度过最冷的一个冬天!
- 韩磊-我心中的偶像
- C#中动态创建控件及事件处理程序、置于顶层
- 配置FILTER过滤管道,解决乱码问题(在服务器下配置,及在JBUILDER下配置)
- Hibernate3对Mysql数据库中Text类型字段的支持
- umask如何设置