onvif server端集成到BOA服务器后不定时出现closewait问题

关于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傍晚

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值