onvif server端集成到BOA服务器后不定时出现closewait问题 4000
2017-08-18 18:13
204 查看
关于closewait的原因不再细述,可自行百度。下面重点介绍原因现象和解决办法
Boa 80端口出现closewait问题现象:
1.不定时的出现80端口closewait的现象,经实验发现在重启NVR的时候容易出现。
2.设备加入NVR后,使用TCP方式单独向设备发送不完整报文,设备的80端口不出现closewait。
3.设备不加入NVR,使用TCP方式单独向设备发送与1同样的不完整报文,设备的80端口立马出现closewait。
两台设备同时使用同样的boa。并将接收到的数据包打印出来。一个加入NVR 一个不加入NVR
原因:
在soap框架中用于onvif进行数据处理的soap.buf的大小定义为65535 ,而我这边定义的ONVIF_BUFFER的数组大小是1024*20
在从Boa的socket获取到数据之后,将此数据使用strcpy复制到ONVIF_BUFFER中,然后交由ONVIF进行处理,ONVIF在处理数据时候
使用memecpy直接将ONVIF_BUFFER的首地址起始的65535个内存都复制给ONVIF进行使用。
在接入onvif后,由于在代码中每次清空ONVIF_BUFFER的时候只是清空1024,与NVR连接之后会收到大于1024大小的数据包,此时有包截至符
存储在以ONVIF_BUFFER为起始地址的后续65535个内存中,ONVIF在处理的时候就能够跳出死循环。
解决办法:
1.将原来按照BOA的BUFFER大小设计的BUFFER改为根据ONVIF的BUFFER大小设计
2.在BOA读取header的时候(或者再boa接收完数据并且判断完是onvif报文之后),加入onvif的包完整性检测代码----即判断是否在包结尾收到":Envelope>"
3.在进入onvif之前加入判断<?和?>是否配对成功,如果成功再交由onvif进行处理。
--------------------收到这样的字符则说明包接收完成,交由ONVIF进行后续处理,否则直接舍弃这个包,并断开socket。
4.修改onvif框架使其在判断xml格式正确与否的时候,在读取完数据的时候直接跳出死循环,另外
-------------------------------------------
解决onvif收到错误包,截断包的情况引起onvif框架内部死循环导致的closewait
这个问题郁闷了好久期间也查过了boa的代码发现其在对于closewiat问题的检测上做的还可以,一个偶然发现发送格式不正确的xml格式的报文给boa,就会出现这个问题。最终定位问题是onvif自己的xml解析的问题,在boa和onvif整合后,使用一个BUFFER将从boa获取的数据转交给onvif进行处理,在onvif处理这些数据包的过程的时候,是通过判断xml文档中的<? 和?>是否配对, </>是否都一一匹配来进行检测的,如果检查出来不匹配则onvif会一直在死循环去读取BUFFER去获取数据,从而造成boa的cpu利用率高,产生closewait的问题。
我的解决办法是在接受到onvif数据后,在boa代码中先进行一次xml格式的筛查,如果筛查没问题交给onvif进行处理。
目前采用这样的办法是可以解决问题还需要后续继续填坑!!!
201708018傍晚
Boa 80端口出现closewait问题现象:
1.不定时的出现80端口closewait的现象,经实验发现在重启NVR的时候容易出现。
2.设备加入NVR后,使用TCP方式单独向设备发送不完整报文,设备的80端口不出现closewait。
3.设备不加入NVR,使用TCP方式单独向设备发送与1同样的不完整报文,设备的80端口立马出现closewait。
两台设备同时使用同样的boa。并将接收到的数据包打印出来。一个加入NVR 一个不加入NVR
原因:
在soap框架中用于onvif进行数据处理的soap.buf的大小定义为65535 ,而我这边定义的ONVIF_BUFFER的数组大小是1024*20
在从Boa的socket获取到数据之后,将此数据使用strcpy复制到ONVIF_BUFFER中,然后交由ONVIF进行处理,ONVIF在处理数据时候
使用memecpy直接将ONVIF_BUFFER的首地址起始的65535个内存都复制给ONVIF进行使用。
在接入onvif后,由于在代码中每次清空ONVIF_BUFFER的时候只是清空1024,与NVR连接之后会收到大于1024大小的数据包,此时有包截至符
存储在以ONVIF_BUFFER为起始地址的后续65535个内存中,ONVIF在处理的时候就能够跳出死循环。
解决办法:
1.将原来按照BOA的BUFFER大小设计的BUFFER改为根据ONVIF的BUFFER大小设计
2.在BOA读取header的时候(或者再boa接收完数据并且判断完是onvif报文之后),加入onvif的包完整性检测代码----即判断是否在包结尾收到":Envelope>"
3.在进入onvif之前加入判断<?和?>是否配对成功,如果成功再交由onvif进行处理。
--------------------收到这样的字符则说明包接收完成,交由ONVIF进行后续处理,否则直接舍弃这个包,并断开socket。
4.修改onvif框架使其在判断xml格式正确与否的时候,在读取完数据的时候直接跳出死循环,另外
-------------------------------------------
解决onvif收到错误包,截断包的情况引起onvif框架内部死循环导致的closewait
这个问题郁闷了好久期间也查过了boa的代码发现其在对于closewiat问题的检测上做的还可以,一个偶然发现发送格式不正确的xml格式的报文给boa,就会出现这个问题。最终定位问题是onvif自己的xml解析的问题,在boa和onvif整合后,使用一个BUFFER将从boa获取的数据转交给onvif进行处理,在onvif处理这些数据包的过程的时候,是通过判断xml文档中的<? 和?>是否配对, </>是否都一一匹配来进行检测的,如果检查出来不匹配则onvif会一直在死循环去读取BUFFER去获取数据,从而造成boa的cpu利用率高,产生closewait的问题。
我的解决办法是在接受到onvif数据后,在boa代码中先进行一次xml格式的筛查,如果筛查没问题交给onvif进行处理。
目前采用这样的办法是可以解决问题还需要后续继续填坑!!!
201708018傍晚
相关文章推荐
- 服务端出现大量close_wait问题
- 解决:HttpClient导致应用出现过多Close_Wait的问题
- 测试的时候浏览出现 "WebDev.WebServer.exe 遇到问题需要关闭。我们对此引起的不便表示抱歉。
- 解决SharePoint Server Foundation安装过程中出现的问题
- 解决一个问题的思路 之“解决已经写满con.close() 仍然出现"但是尚未从池中获取连接"的连接池耗尽问题”
- 定时任务执行git clone出现permission denied(publickey)问题的解决
- vs 或 Sql server2012连接Sql server时出现的问题:已成功与服务器建立连接,但在登陆过程中发生错误
- 20170208大量Http请求close_wait的问题
- 【fd泄漏问题】Monkey测试出现fd泄漏导致system_server重启
- 解决“在eclipse中配置Tomcat时,出现Cannot create a server using the selected type的错误”的问题
- mysql连接linux系统提示“登录出现1130 is not allowed to connect to this MySql server”问题,解决方法
- 服务器产生大量CLOSE_WAIT状态的socket问题的排查过程
- 解决iis出现 Server Application Error 问题(无法访问aps页)
- Eclipse 调试时adb 出现adb server is out of date.killing...的问题
- window server 2008 R2 下oracle安装过程出现问题总结:
- (word导出问题)解决:服务器出现意外情况。 (异常来自 HRESULT:0x80010105 (RPC_E_SERVERFAULT))的解决方法
- Biztalk Server简介(出版物作品,禁止转载,如果出现法律问题,文责自负)
- 更新xorg-server后出现的问题解决办法
- 解决:浏览页面时,出现"WebDev.WebServer.exe 遇到问题需要关闭。我们对此引起的不便表示抱歉。"问题
- window server 2008R2下ORACLE11G 出现ORA-12514问题解决