【2019-01-22】【转】服务器中判断客户端socket断开连接的方法

【2019-01-22】【转】服务器中判断客户端socket断开连接的方法 [历史归档]本文原发布于 cstriker1407.info 个人博客内容为历史存档仅供参考。发布时间2019-01-22 标题【转】服务器中判断客户端socket断开连接的方法分类操作系统 / linux 标签CC·socket服务器中判断客户端socket断开连接的方法本文转至【 https://www.cnblogs.com/jacklikedogs/p/3976208.html 】有删改。判断连接断开的方法法一当recv()返回值小于等于0时socket连接断开。但是还需要判断 errno是否等于 EINTR如果errno EINTR 则说明recv函数是由于程序接收到信号后返回的socket连接还是正常的不应close掉socket连接。法二struct tcp_info info;int lensizeof(info);getsockopt(sock IPPROTO_TCP TCP_INFO info (socklen_t *)len);if((info.tcpi_stateTCP_ESTABLISHED)) 则说明未断开 else 断开法三若使用了select等系统函数若远端断开则select返回1recv返回0则断开。其他注意事项同法一。法四int keepAlive 1; // 开启keepalive属性int keepIdle 60; // 如该连接在60秒内没有任何数据往来则进行探测int keepInterval 5; // 探测时发包的时间间隔为5 秒int keepCount 3; // 探测尝试的次数.如果第1次探测包就收到响应了则后2次的不再发.setsockopt(rs SOL_SOCKET SO_KEEPALIVE (void *)keepAlive sizeof(keepAlive));setsockopt(rs SOL_TCP TCP_KEEPIDLE (void*)keepIdle sizeof(keepIdle));setsockopt(rs SOL_TCP TCP_KEEPINTVL (void *)keepInterval sizeof(keepInterval));setsockopt(rs SOL_TCP TCP_KEEPCNT (void *)keepCount sizeof(keepCount));设置后若断开则在使用该socket读写时立即失败并返回ETIMEDOUT错误法五自己实现一个心跳检测一定时间内未收到自定义的心跳包则标记为已断开。