iocp网络通信之如何判断客户端连接断开
2013-11-19 22:38
423 查看
BOOL r = ::GetQueuedCompletionStatus(hCompletionPort, &dwBytesTransferred, (LPDWORD)&hCompletionSocket, (LPWSAOVERL APPED *) &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并不影响。
相关文章推荐
- PPC中如何判断网络已经连接或者断开
- 【VS开发】TCP服务端如何判断客户端断开连接
- [WM][转]PPC中如何判断网络已经连接或者断开
- tcp 服务端如何判断客户端断开连接
- PPC中如何判断网络已经连接或者断开
- [WM][转]PPC中如何判断网络已经连接或者断开
- tcp 服务端如何判断客户端断开连接
- PPC中如何判断网络已经连接或者断开(转)
- [WM][转]PPC中如何判断网络已经连接或者断开
- 【VS开发】如何判断客户端SOCKET已经断开连接?
- tcp 服务端如何判断客户端断开连接
- PC中如何判断网络已经连接或者断开
- QT TCP服务端如何判断客户端已断开连接
- 关于socket编程中服务器端如何检测客户端连接断开的问题
- java socket判断客户端是否断开连接
- 第三周第四天(【客户端服务器通信】【网络连接InetAddress类】)
- WindowMobile如何判断网络有没连接和如何判WebService服务器地址是否正确(wifi有无打开)
- 详细讲解如何使用Winsock实现网络通信——客户端
- php判断客户端浏览器是否已经断开连接
- 如何判断连接状态断开,Linux:C/Socket多路复用select(),阻塞