文档章节

Tcp服务端判断客户端是否断开连接

r
 ranjiewen
发布于 2016/11/03 23:51
字数 538
阅读 50
收藏 0

     今天搞tcp链接弄了一天,前面创建socket,绑定,监听等主要分清自己的参数,udp还是tcp的。好不容易调通了,然后就是一个需求,当客户端主动断开连接时,服务端也要断开连接,这样一下次客户端请求链接的时候才能成功链接。

      然后就开始找各种方法。其中简单的是看recv()返回为0,表明断开了链接,但是recv函数始终返回SOCKET_ERROR,找不到原因。。。。。。。。。。。。

      现在已经调通了,就是recv()==0时,断开连接。先主要是没有用accept()的socket,当然接收不到东西。。。

参考的方法: 下面来罗列一下判断远端已经断开的方法:

法一: 当recv()返回值小于等于0时,socket连接断开。但是还需要判断 errno是否等于 EINTR,如果errno == EINTR 则说明recv函数是由于程序接收到信号后返回的,socket连接还是正常的,不应close掉socket连接。

 

法二:

struct tcp_info info;

int len=sizeof(info);

getsockopt(sock, IPPROTO_TCP, TCP_INFO, &info, (socklen_t *)&len); if((info.tcpi_state==TCP_ESTABLISHED)) 则说明未断开 else 断开

 

法三: 若使用了select等系统函数,若远端断开,则select返回1,recv返回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错误

 

法五: 自己实现一个心跳检测,一定时间内未收到自定义的心跳包则标记为已断开。 参考:http://www.cppblog.com/luketowne/articles/77780.html http://www.blogjava.net/thisliy/archive/2010/02/17/313271.html http://blog.csdn.net/henry000/article/details/7250866

本文转载自:http://www.cnblogs.com/ranjiewen/p/5723936.html

下一篇: 进程同步
r
粉丝 1
博文 203
码字总数 28
作品 0
武汉
程序员
私信 提问
关于TCP长连接和发送心跳的一些理解

作者:郭无心 链接:https://www.zhihu.com/question/35013918/answer/63664974 来源:知乎 著作权归作者所有,转载请联系作者获得授权。 游戏服务器常常有心跳包的设计。 我们的心跳包就是为...

huang19830104
2018/06/28
0
0
Android跨进程通信之Socket

借鉴自开发艺术 Socket,套接字,分为流式套接字TCP,用户数据报套接字UDP。 TCP面向连接,稳定,双向,有着经典的3次挥手、4次挥手,有超时重传机制 UDP面向地址,不稳定,拥塞、复杂网络环...

qq_36523667
2018/01/29
0
0
tcp 服务端如何判断客户端断开连接

最近在做一个服务器端程序,C/S结构。功能方面比较简单就是client端与server端建立连接,然后发送消息给server。我在server端会使用专门的线程处理一条socket连接。这就涉及到一个问题,如果...

陈国成
2017/06/15
0
0
TCP三次握手和四次挥手以及11种状态

TCP三次握手和四次挥手以及11种状态 1、三次握手 置位概念:根据TCP的包头字段,存在3个重要的标识ACK、SYN、FIN ACK:表示验证字段 SYN:位数置1,表示建立TCP连接 FIN:位数置1,表示断开T...

IT_外卖小哥
2018/01/26
0
0
TCP-Keepalive作用

TCP交互在三次握手确定连接之后,后续可能不会一直有数据在通讯,但此时双方的连接是保持的,如果在这段时间内没有数据,客户端(或服务端)突然关掉了,或者客户端到服务端之间的网络突然断...

sensy
2018/07/17
52
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx常用命令

# cd /usr/local/nginx/sbin 查看版本 # ./nginx -v 查看进程 # ps -ef | grep nginx 查看nginx端口号 # ss -lnput | grep nginx 启动 # ./nginx 关闭 # ./nginx -s stop 重新加载配置文件 ......

行者终成事
6分钟前
2
0
002-docker的网络设置和数据管理

Docker 网络设置 docker会创建一个桥接网卡[docker 0],docker有两种映射方式,一种是随机映射,一种是指定映射 生产场景一般不用随机映射 随机映射的好处是端口由docker分配,不会冲突 安装n...

侠客行之石头
10分钟前
1
0
Rust学习笔记一 数据类型

写在前面 我也不是什么特别厉害的大牛,学历也很低,只是对一些新语言比较感兴趣,接触过的语言不算多也不算少,大部分也都浅尝辄止,所以理解上可能会有一些偏差。 自学了Java、Kotlin、Python、...

MusiCodeXY
12分钟前
2
0
Java 脚本引擎入门

Java Script Engine Java 脚本引擎可以将脚本嵌入Java代码中,可以自定义和扩展Java应用程序,自JDK1.6被引入,基于Rhino引擎,JDK1.8后使用Nashorn引擎,支持ECMAScript 5,但后期还可能会换...

阿提说说
58分钟前
5
0
05.深入浅出索引(下)

在下面这个表T中,如果我们执行select * from T where k between 3 and 5,需要执行几次树的搜索操作,会扫描多少行? mysql> create table T ( id int primary key, k int not null default...

scgaopan
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部