关于C#的异步Socket服务端客户端速率匹配问题
客户端是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);
}
请问一下服务端要怎样才能接收的过来,不至于让客户端阻塞?
另外服务端如何将接收的数据进行解析,而且不影响数据的接收?