设备长时间运行后,无法连接其他onvif设备

  • 1 问题的表像

设备的功能点是通过ONVIF定时抓图,这时就需要不断的访问球机80端口。问题点:设备正常运行一段时间后,就无法连到ONVIF上了,重启一下设备,又正常了。从这个点初步分析是设备侧的问题。通过onvif的GetSystemDateAndTime,返回error,无法继续操作。

设备长时间运行后,无法连接其他onvif设备_第1张图片

  • 2.TCP报文分析

设备长时间运行后,无法连接其他onvif设备_第2张图片

 每次握手时,都是主动发一个RST。对握手报文的字段进行分析,未发现任何异常。

设备长时间运行后,无法连接其他onvif设备_第3张图片

  • 3.排查过程

3.1TCP客户端使用固定端口,也是运行一段时间就出错。

	struct sockaddr_in client_addr;//客户端指定端口号测试    
	client_addr.sin_addr.s_addr = htonl(INADDR_ANY);    
	client_addr.sin_family = AF_INET;	
	client_addr.sin_port = htons(38777);//固定端口号	
	/* 绑定端口 */
	if (bind(sockfd, (struct sockaddr *)&client_addr, sizeof(struct sockaddr)) == -1)

 3.2创建TCP后,HTTP使用短连接Connection: close。使用netstat查看一切正常

3.3最后,怀疑进程占用的socket太多,到网上搜索终于找到了lsof,这个命令之前也用过,把它给忘了。结果一目了然,同一个文件,打开多次没有释放。原来在代码中fopen后,没有close()操作,导致不停的占用文件句柄,占满之后,就不能创建tcp连接了。

总结,问题的现像,与根源有点距离。开始一直以为创建tcp,执行http操作的代码有问题。引入这个问题,主要还是由于开发人员的代码质量太差,做个demo马马虎虎能完成,到产品中长时间一运行,就出现各种奇葩问题。我得抱怨一下,有时就是不停的救火,顺便提升一下分析问题的能力。

你可能感兴趣的:(C++,网络,tcp/ip,三次握手,onvif)