我有个项目,设计了一个UDP服务端。
是通过UDPCLIENT 的一个实例(同一端口)提供收发服务。
当项目上线测试后,奇怪的现象发生。
如果重启过服务器的话,服务器可以运行一段较长时间无异常。
但一段时间之后,奇怪的事情来了。
1、例如之前有A\B\C等N个客户端已经连接到服务端,服务端一直持续为它们 提供服务,然后在正常运行一段时间后,ABC的数据都会变得不正常,服务端无法再正常解析数据提供服务了。客户数据是可以接收到,但已经不正确了。
2、然后更搞笑的是,如果有新入的连接(不同的IP),服务端却又能正常提供为该客户服务,但服务一段时间后,就会表现和ABC一样。
然后重复上面的两个问题 ,不断累积,反正有新客户(不同的IP)就正常服务,但不定什么时候就不正常了。
我的接收是通过异步BeginReceive投递的,而发送则是以阻塞方式Send
其中EndReceive也进行了线程同步, UDP的接收缓冲区我也设置得足够大了,TCP连接限制和端口可用数我也修改过,但问题依然无法解决。
让这个问题搞了几天了,希望大家能提供些思路和解决办法 ,真的古怪
额,看来UDPCLIENT类是有问题,高吞吐的服务端不能用这个偷懒,我换成socket就正常了。多谢几位回答
检查下缓冲区是否清空、每次都已读完再清空,如果与到某一端比发送端的读取速度要快,这时候接收端的数据已读完并已经清空了,但是发送端还在继续发送的话就可能存在脏读,.net的底层存在这种情况,数据读取最好用while循环去读取,不要一次性读取多少个字节,一次性读取多少个字节在某些网络环境不佳的情况下就出现你那种问题了。
在测试环境下用同样的数据进行测试,把数据流监控并输出,看看过段时间后不正确的数据和正确的数据的差异在哪里。
可以用ethereal辅助调试
UDP 没法保证数据的准确性的,UDP和TCP有关系吗? 您理解UDP吗?改用TCP试试
看了你的问题,我能理解到的是 你为每个用户UDP请求分配了独立的 缓冲区
看是否是 最容易 忘记的 一项 缓冲区 脏读 了
是否每次接收完毕后清空了缓冲区