iocp网络通信之如何判断客户端连接断开
来源:互联网 发布:js获取当前页面内容 编辑:程序博客网 时间:2024/05/21 10:35
BOOL r = ::GetQueuedCompletionStatus(hCompletionPort, &dwBytesTransferred, (LPDWORD)&hCompletionSocket, (LPWSAOVERLAPPED *) &lpOvlpEx, INFINITE);if (hCompletionSocket== INVALID_SOCKET || lpOvlpEx == NULL){Sleep(10);continue;}if (!r){proxy->SafeClose(lpOvlpEx);TRACE("GetQueuedCompletionStatus error! %d\n",hSocket);continue;}else if (dwBytesTransferred ==0){proxy->SafeClose(lpOvlpEx);TRACE(".....................%d..........closed & freed........\n",hSocket);continue;}
上面的GetQueuedCompletionStatus是接收IOCP通知的主要函数,通过dwBytesTransferred、hCompletionSocket、lpOvlpEx以及返回值r即可判断出客户端是否关闭。
但是,GetQueuedCompletionStatus不能得出网络是否异常了,比如客户端拔网线,比如突然重启,这些是无法捕获的。这是由于TCP协议本身的问题,其实细想一下,客户端还没有把数据发送缓冲区时系统就崩溃了,这种情况下肯定无法捕获的,只能通过应用协议来判断了。常用的解决方法三种:
- 定时心跳包,超时没收到回应,就认为客户端就是断开了。
- 通过SO_KEEPALIVE来判断,默认是2小时进行一次检测,自己也可以设置检测间隔,但会影响其它系统所有正在使用的Socket,慎用
- 通过SIO_KEEPALIVE_VALS,该选项不同于SO_KEEPALIVE 机制的就是它是针对单个连接的,对系统其他的Sokcet并不影响。
- iocp网络通信之如何判断客户端连接断开
- tcp 服务端如何判断客户端断开连接
- Linux网络编程中服务端判断客户端断开连接。
- 【VS开发】TCP服务端如何判断客户端断开连接
- 【VS开发】如何判断客户端SOCKET已经断开连接?
- QT TCP服务端如何判断客户端已断开连接
- 如何判断socket客户端断开
- PPC中如何判断网络已经连接或者断开
- PPC中如何判断网络已经连接或者断开
- PC中如何判断网络已经连接或者断开
- 完成端口(IOCP)怎么判断某个连接是否断开
- JAVA Socket服务器 判断客户端连接断开
- 判断客户端是否主动断开连接
- Socket服务器 判断客户端连接断开
- java socket判断客户端是否断开连接
- unix domain socket判断客户端断开连接
- Tcp服务端判断客户端是否断开连接
- 初探.NET判断Windows网络连接之突然断开或连接
- android静默安装的实现
- 修复远程桌面网关2
- java基础---集合类
- Win32多线程之后台线程
- Symbian OS 操作系统环境的搭建
- iocp网络通信之如何判断客户端连接断开
- Struts 服务端表单数据验证流程
- Oracle XML DB
- NSPredicate官方文档翻译
- C++ explicit
- 获得获得手机cpu系列号
- CodeForces 142C Help Caretaker
- Oracle EXPLAIN PLAN用法
- Windows下32位汇编程序环境搭建