请教Server收包出现异常的原因
现象:
客户端A向服务端B发送固定格式的请求“Cmd=0001&ID=1234567890”(其中ID是可变的),B处理后给A返回处理结果。
现在发现,B运行一段时间(一般是1天以上)后,A发送到B的请求大部分都出现了超时错误.查看B的日志,在错误期间,B有收到超过10K的包,而且该包是由多个请求构成的,比如“Cmd=0001&ID=1234567890Cmd=0001&ID=1234567890Cmd=0001&ID=1234567890Cmd=0001&ID=1234567890(这里省略)”
说明:A到B之间是长链接,A是多进程,B是多线程处理。
问题:请问出现这种情况一般是什么问题导致的呢?跟了这个问题多天了,没有一点头绪了。
请大家多多帮忙。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
“显式的 push 操作”是指什么?send?
一问一答的协议必须要加显式的 push 操作。
例如 SMTP 就是这样的。
这个问题其实很简单,先处理好包的边界,再检查多进程和多线程是不是有问题,再检查其他网络程序是否也有类似的问题(排除硬件、驱动等其他方面的问题),然后就没问题了。
楼主显然是个新手,网络和多线程可能都不够熟练,以后慢慢就会好了,没有代码没法找原因。
目前确实没有很好的处理这个。但A跟B之间理论上是一问一答的,按理说不应该出现超过10K的请求包啊。
你说的这个是不是怀疑重复收包了呢?
没有明确的应用层协议定义,你是怎么区分包头的呢?是靠Cmd中的字母“C”来判断包的开头吗?包结束又是怎么判断的?
假设收到这么个包
“Cmd=0001&ID=12”
你会认为这个包已经完整结束了吗?如果是,再收到了一个“3456789”你又打算把这个包怎么处理?
半天后,如果 服务器正常-->
服务器的cpu使用率是多少?
最大网络流量占带宽的多少?
平均网络流量占带宽的多少?