利用libevent进行网络异常检查

简介:

《网络编程释疑之: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系统类似。


另外分享给大家一篇文章《网络异常检查》

本文转自永远的朋友博客51CTO博客,原文链接http://blog.51cto.com/yaocoder/1349003如需转载请自行联系原作者


yaocoder

相关文章
|
22天前
|
XML JSON 网络协议
【网络原理】——拥塞控制,延时/捎带应答,面向字节流,异常情况
拥塞控制,延时应答,捎带应答,面向字节流(粘包问题),异常情况(心跳包)
|
30天前
|
运维 监控 安全
公司监控软件:SAS 数据分析引擎驱动网络异常精准检测
在数字化商业环境中,企业网络系统面临复杂威胁。SAS 数据分析引擎凭借高效处理能力,成为网络异常检测的关键技术。通过统计分析、时间序列分析等方法,SAS 帮助企业及时发现并处理异常流量,确保网络安全和业务连续性。
51 11
|
3月前
|
运维 监控 网络协议
|
2月前
|
安全 Java Linux
如何确定 Broken Pipe 异常是由网络问题还是其他原因引起的
Broken Pipe 异常可能由网络问题或其他原因引起。要确定具体原因,可以检查网络连接状态、防火墙设置和系统日志,同时分析异常发生时的上下文信息。
341 5
|
3月前
|
Docker 容器
docker中检查容器的网络模式
【10月更文挑战第5天】
301 1
|
5月前
|
机器学习/深度学习 运维 监控
|
5月前
|
存储 安全 测试技术
网络中的状态检查是什么?
【8月更文挑战第24天】
128 0
|
5月前
|
Kubernetes 监控 网络协议
在K8S中,如果因为网络原因导致Pod异常,该如何排查?
在K8S中,如果因为网络原因导致Pod异常,该如何排查?
|
5月前
|
Kubernetes 网络协议 Linux
如何检查 Kubernetes 网络配置
如何检查 Kubernetes 网络配置
76 0
|
6月前
|
测试技术 API Android开发
autox.js如何监听异常情况,比如网络中断、内存慢、应用死机或者页面无响应
autox.js如何监听异常情况,比如网络中断、内存慢、应用死机或者页面无响应