Socket服务端一直收空包的原因与解决方法
Posted 笨笨的妖孽丶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Socket服务端一直收空包的原因与解决方法相关的知识,希望对你有一定的参考价值。
最近做socket服务端,大部分时候系统是正常的,但是运行个一段时间就会一直以超高的频率收到很多数据,一开始以为是下位机上报的,没怎么上心,后来下位机工程师说他们没上报,所以重新看了下代码,发现程序会一直调用 netStream.BeginRead,EndRead,一直收数据,而且受到的数据包都是0字节,百度了20分钟,大神们说socket客户端正常关闭的时候服务端会收到一个长度是0的数据包,如果一直循环调用会一直收到,原话如下
出现原因:一、用户正常退出,这时你还循环调用了Receive方法时会出现。并会陷入死循环。
二、用户非正常退出,包括拔网线,死机,服务器会捕捉到一个异常
处理方法:一、你只要在循环里对数据进行判断一下,如果数据为0就中止循环,并关闭此Socket连接即可
确实是这样,测试的客户端没写socket.Clost(),都是直接关闭,所以能不做的客户端退出;当客户端点击断开连接后服务端就会收到一个空包,而且Connected还是true,如果没判断是否是空包的换会一直循环接收空包,所以每次收到数据的时候需要判断是包的长度,如果是0就中断循环,并关闭socket。
新人私人备忘,如果有说错的地方希望大神指出。
以上是关于Socket服务端一直收空包的原因与解决方法的主要内容,如果未能解决你的问题,请参考以下文章
socket网络编程:客户端与服务端代码bug修复(代码完善)
linux C/C++多进程教程(多进程原理以及多进程的应用以多连接socket服务端为例(fork子进程处理socket_fd),同时介绍了僵尸进程产生原因与解决方法)(getpidfork)