利用libevent进行网络异常检查
来源:互联网 发布:淘宝买药付款流程 编辑:程序博客网 时间:2024/06/07 23:23
《网络编程释疑之:TCP半开连接的处理》这篇文章主要讲述了网络异常的出现、以及如何在服务端解决存在的网络异常。同时,客户端能否及时检测到自身的网络异常(比如网络禁用,网线断开......)也同样影响着客户端的正常逻辑,下面我就通过自己的实验和实践来给大家说明下。
场景是这样的,客户端和服务端建立起一个长连接,并且通过一个心跳来维持上线状态、同时也为了解决上面所说的TCP半开连接问题。客户端在自身出现网络异常的情况下下线,但是一旦自身网络恢复要自动恢复此前的正常逻辑。这种情况在现实场景中有很多,比如底层协议为TCP的即时聊天软件在自身网络异常的情况下掉线,一旦网络恢复就自动上线,还有其他很多的基于TCP自动重连应用。这样,要求我们能及时快速的响应到网络异常并开始新的自动重连动作。
当然,我们可以从操作系统的层次去迅速响应到网络异常(比如网络禁用,网线断开...),但是我目前还没找到特别好的方案,望有过实践的朋友可以指导一二。我便退一步选用了在网络应用层进行这种网络异常的检查,在这个过程中选用了libevent网络库的
void bufferevent_setcb (struct bufferevent *bufev, bufferevent_data_cb readcb, bufferevent_data_cb writecb, bufferevent_event_cb eventcb, void *cbarg)
方法,利用eventcb回调来响应网络关闭或异常事件。之所以写这篇文章,就是因为在这过程中发现了一些不同的网络异常行为导致的处理不同,甚至在不同的操作系统下也有不同。
Windows系统
禁用网络会立马响应eventcb回调,对应的事件是BEV_EVENT_ERROR
。
而断开网线不会立马响应eventcb回调,而是在下一次利用此socket进行数据操作时响应eventcb回调,对应的事件为BEV_EVENT_EOF
。
Linux系统(CentOS)
禁用网络和断开网线都不会响应eventcb回调,需要自己去处理关闭socket描述符并清理响应libevent的资源。
Android系统
奇怪的是同是linux内核,但是在禁用网络和wifi断开情况下的处理却和windows系统类似。
另外分享给大家一篇文章《网络异常检查》
- 利用libevent进行网络异常检查
- 网络异常检查
- 网络异常检查
- 利用单元测试对PHP 代码进行检查
- 利用单元测试对PHP 代码进行检查
- linux利用ping进行链路检查
- 用libevent进行网络编程(fork,thread,event_based)
- 利用WSAEventSelect进行网络通信
- 利用select进行网络通信
- 利用IXCHARIOT进行网络测速
- 利用Handler进行网络请求
- 利用Retrofit进行网络访问
- 检查网络连接状态,如果无连接,进行设置网络。
- 利用Ajax和Servlet进行登录用户名检查
- 利用Oracle的enable validate约束进行数据检查
- Chrome 利用 Google 搜索的拼写检查技术进行改进
- C/C++利用位运算来进行函数参数检查
- Android(Java)利用findbugs进行代码静态检查
- 我的python学习记录_Python基础教程
- Oracle 字符串分割
- GPIO的上拉电阻的作用
- Map 集合里 判断里面参数是否存在 hibernate String时间查询
- linux:SUID、SGID详解
- 利用libevent进行网络异常检查
- Hadoop cannot find namenode pid file when shutdown
- 关于Java中的IEEE765浮点数表示法
- 面向对象的三大特征
- VS2012 下编译boost1.52
- 树状数组--改区间求点
- Linux下后台程序完成自动输入密码等交互行为的例子
- 对Android Activity的四种LaunchMode的浅析
- 对象链表与对象数组的使用