Socket服务端一直收空包的原因与解决方法

最近做socket服务端,大部分时候系统是正常的,但是运行个一段时间就会一直以超高的频率收到很多数据,一开始以为是下位机上报的,没怎么上心,后来下位机工程师说他们没上报,所以重新看了下代码,发现程序会一直调用 netStream.BeginRead,EndRead,一直收数据,而且受到的数据包都是0字节,百度了20分钟,大神们说socket客户端正常关闭的时候服务端会收到一个长度是0的数据包,如果一直循环调用会一直收到,原话如下

出现原因:一、用户正常退出,这时你还循环调用了Receive方法时会出现。并会陷入死循环。
    二、用户非正常退出,包括拔网线,死机,服务器会捕捉到一个异常
处理方法:一、你只要在循环里对数据进行判断一下,如果数据为0就中止循环,并关闭此Socket连接即可

确实是这样,测试的客户端没写socket.Clost(),都是直接关闭,所以能不做的客户端退出;当客户端点击断开连接后服务端就会收到一个空包,而且Connected还是true,如果没判断是否是空包的换会一直循环接收空包,所以每次收到数据的时候需要判断是包的长度,如果是0就中断循环,并关闭socket。

新人私人备忘,如果有说错的地方希望大神指出。

猜你喜欢

转载自www.cnblogs.com/bbyn/p/9111893.html