客户端是Linux下C编写服务器端由Windows 2003 Server下C#编写服务端使用SocketAsyncEventArgs参数进行建立连接和收发数据在SocketAsyncEventArgs参数Completed事件绑定的方法中进行收到数据处理处理步骤如下1、将收到的args.Buffer中的BytesTransferred数量的字节Push入队列Queue<byte[]>中,然后调用socket.ReceiveAsync()继续进行异步接收2、线程a循环从队列中Pop出byte[]数据进行解析3、队列的Pop和Push操作均有lock 问题如下:1、百兆网络环境下,服务端的接收流量大概在0M到80~90MB/s之间波动剧烈2、客户端会出现发送缓冲区满的现象,也就是说,服务端处理过慢3、如果接收线程中的处理去掉Push操作,客户端发送正常,服务端也接收正常,网络流量大概在80~100MB/s波动 从现象看,是因为Push操作导致服务端处理速度变慢,从而客户端出现发送缓冲区满的现象 Push操作lock(this.queue){queue.EnQueue(byte[] s)}操作。Pop操作lock(this.queue){if(this.queue.Count > 0){return this.queue.DeQueue()}else{return null}} 解析数据线程a的操作while(true){ byte[] s = this.queue.Pop(); if(s != null) { 解析 ... } Thread.Sleep(100);} 请问一下服务端要怎样才能接收的过来,不至于让客户端阻塞?另外服务端如何将接收的数据进行解析,而且不影响数据的接收?
解决方案 »
- 我想用C#做个程序.让火狐总在其他程序的前面
- NHibernet用在哪里?
- SQL2005里面的CTE怎么在C#后台调用
- sql动态交叉查询后的datalist动态绑定问题
- 请问各位:我用C#的ASP.net开发了一WEB程序,请问如何部署?在本机2000SERVER的IIS上建个虚拟目录后部署成功。但在别人的XP系统下部署不
- 几乎已经可用了的“IP输入框”用户自定义控件
- imageComboBox的使用问题
- 帮忙看下我这样写的扩展方法为什么点不出来?
- [找书] Visaul C#.NET从入门到精通
- 新建一个Asp.net 应用程序,如何选择自己的创建目录?
- Command对象的常用方法!!
- 字符传输格式
2、接收数据的线程是系统在SocketAsyncEventArgs参数Completed事件引发时候启动的
3、处理数据的是一个线程
4、客户端和服务端是有心跳操作的