日期:2014-05-19  浏览次数:20771 次

【C/S丢包率】WinForm(C#)开发的C/S应用,丢包率居高不下,请有经验的进来探讨探讨
系统架构是:

SocketService
      +   n   Protocol
      +   1   SessionFactory
                    +   n   SocketSession
----------------------------------------
SocketService中建立一个线程监听
然后用反射技术加载各种协议
收到客户端连接,由SessionFactory生成SocketSession

-----------------------------------------------
SocketSession里启动了两个线程,两个Queue
线程   _ThreadMain   负责Socket读写,组装数据包并发送到_ReciveQueue,下发_SendQueue缓存的响应包
线程   _ThreadProc   负责处理   _ReciveQueue里面的请求包,转交给上级的相应Protocol模块处理,并将处理的结果送回   _SendQueue

==============================
手动发送单个数据包(间隔大约在1.5秒左右)每个都能收到回复

服务器端和客户端都用默认的Queue大小,服务器每个循环间隙Sleep(50)
客户端发送间隔10毫秒的100包
能收到服务器的响应包最多51个,而且1~51之间逢双数丢失   丢包率在70%以上

现在调整Queue的初始化大小到400/800
循环间隙的Sleep调整到60左右,能收到连续的78个响应,丢包率   22%

实在找不到办法继续提升性能了……请大家帮忙找找问题在哪儿



------解决方案--------------------
如果发送端用send那么很容易丢包,如果用sendto那就不容易丢
------解决方案--------------------
帮顶一下,水平是菜了点!
------解决方案--------------------
我估计已经封装的看不到socket的部分了

先测试下代码,尽量把收发的部分独立出来单独测试
------解决方案--------------------
可能在处理数据包等待回送信息的同时,又接收到数据包(这期间有50毫秒的延时),尚未处理的数据包被后发送的数据包覆盖,或者在发送结束标志的判断上有误.能贴几段代码出来看看比较好
------解决方案--------------------
sleep 的时候没抓包吧 ..?

------解决方案--------------------
觉得那2个sleep有些问题。。。
能不能直接用同步方式,调用读的函数,一直等到有数据返回为止。
------解决方案--------------------
帮顶~~
这么分,接一下下~~
HOHO~~
------解决方案--------------------
up
------解决方案--------------------
1 Bote_China说的就是常见的数据阻塞的原因
2 服务器段怎么会用sleep呢?sleep(50)并不代表就是休眠50ms,这里面一般比50ms长
3 我不清楚C#里面的通讯程序的设计,服务器段要Accept才可能对包进行处理
4 处理像你这样的包,服务器瞬间完成,连续100个也会是瞬间完成,但sleep(50)就影响了。
5 再者,添加对数据包的CRC冗余处理,头尾各2个字节用你自定义内容,用于标示一个包的开始和结束,对数据错误的包分析后,你就会发现,有的包里面包含的是1整条,有的包却不是
------解决方案--------------------
应该是数据没有完全读出来
------解决方案--------------------
关注 up
------解决方案--------------------
肯定是sleep的问题
------解决方案--------------------
Up

------解决方案--------------------
不懂,帮顶
------解决方案--------------------
你用sniffer监控一下,看看网络运行情况