网络异常 检查【此篇文章推荐大家看】

来源:互联网 发布:ssh项目源码书籍推荐 编辑:程序博客网 时间:2024/05/29 03:00
无论是否能访问外网,一个路由器上的目标机器,只要是在同一个网段,都是可以互相ping通的。

从原理上分析,协议上,Socket连接使用的是TCP/UDP协议基于IP,Ping使用的是ICMP协议基于 IP。这就决定了两者只是共用IP层。
只要网络是通的,就可以机器间互相共享文件。如果是局域网上,任何单台目标机器ping路由,ping本机都没有问题也可以上网,则说明局域网是通的。参考网络编程经典《TCP/IP详解》)
备注:
1、两台目标机器不在同一个网段是不能ping通的。若要能ping通,则需要路由器去路由转发,如将内网IP映射到一个公网IP或公网域名上(可以使用花生壳内网版客户端)

2、目标机器要能基于tcp/udp连接,必须要能互相ping通,但能ping通不一定就能connect上,可能访问的端口不对,建议更换成正确的端口(如让客户端访问服务端的内网端口映射到的外网端口)。
能顺利ping通外网网址,说明你的计算机与外网网站是互通的。之所以socket TCP连接失败或者UDP无响应,原因可以从以下三个环节中查找:1)本机(你的计算机)防火墙是否屏蔽掉你使用的端口?2)公司外网路由(或网关)路由(网关)是否开放了你所指定的协议(TCP或UDP)以及端口?3)外网网站外网网站是否允许使用你所指定的协议(TCP或UDP)以及端口?上述三个环节,只要有一个出问题,都会导致Socket连接失败,或UDP无响应!

3、服务端和客户端都运行在本地机器上,多个本地客户端只能第一个客户端去连接服务端才有效,即服务端只接收第一个本地客户端的连接请求,后续第二个,第三个等本地客户端的连接请求是不会再被接收的,会是个无响应的连接请求。而且这种服务端和客户端都运行在本地机器上的情形,是不走网卡的。

 

 

 

下面是别处文章的内容:点击打开链接

利用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系统类似。


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

 

0 0