Socket异步通信接收大数据量,接收Buffer溢出问题

DwyaneCV 2017-05-02 04:13:13
服务器采用SocketAsyncEventArgs类进行异步接收多个客户端的数据(100个客户端,每个客户端定时发送1000字节给服务器),服务器buffer大小设置为4096。
但是测试的时候随着客户端数量增加到一定的时候,发生异常,报错“目标数组的长度不够。请检查 destIndex 和长度以及数组的下限。”

原来想着是把buffer的size改成更大来测试,但总觉得这不是一个最好的方式,或者说这样也解决不了问题?想请教一下如何来优化来解决这个问题?

private void ProcessReceive(SocketAsyncEventArgs e)
{// 检查远程主机是否关闭连接
if (e.BytesTransferred > 0)
{
if (e.SocketError == SocketError.Success)
{Socket s = (Socket)e.UserToken;
//判断所有需接收的数据是否已经完成
if (s.Available == 0)
{
// 设置发送数据
Array.Copy(e.Buffer, 0, e.Buffer, e.BytesTransferred, e.BytesTransferred);
e.SetBuffer(e.Offset, e.BytesTransferred * 2);
if ((e.Buffer[0] == 0x55) && (e.Buffer[1] == 0xAA) && (e.Buffer[503] == 0x33) && (e.Buffer[504] == 0xCC))
{
/*数据操作*/
}
if (!s.SendAsync(e)) //投递发送请求,这个函数有可能同步发送出去,这时返回false,并且不会引发SocketAsyncEventArgs.Completed事件
{// 同步发送时处理发送完成事件
this.ProcessSend(e);
}
}
else if (!s.ReceiveAsync(e)) //为接收下一段数据,投递接收请求,这个函数有可能同步完成,这时返回false,并且不会引发SocketAsyncEventArgs.Completed事件
{// 同步接收时处理接收完成事件
this.ProcessReceive(e);
}
}
else
{this.ProcessError(e);}
}
else
{this.CloseClientSocket(e);}
}


问题2:// 设置发送数据
Array.Copy(e.Buffer, 0, e.Buffer, e.BytesTransferred, e.BytesTransferred);
e.SetBuffer(e.Offset, e.BytesTransferred * 2);
如果去掉这两行代码,即使只有一个客户端并且发几十字节的数据,过段时间也会报同样的错,咋回事啊?求指教
...全文
776 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
by_封爱 版主 2017-05-03
  • 打赏
  • 举报
回复
我都用别人写好的SocketAsyncEventArgs...自己写 写不明白的.. 直接拿来用就行了
孤独的海啊 2017-05-03
  • 打赏
  • 举报
回复
引用 1 楼 xdashewan 的回复:
你自己copy自己是个什么概念Array.Copy(e.Buffer, 0, e.Buffer, e.BytesTransferred, e.BytesTransferred);
我也在思考搂着这个动作实在干嘛?
xian_wwq 2017-05-03
  • 打赏
  • 举报
回复
直观感觉问题不是出在接收数据 而是出在数据接收和数据解析没有分离 数据解析花费较多时间,会导致接收效率低下 数据解析是高频动作, 可以借助线程池来完成
xdashewan 2017-05-02
  • 打赏
  • 举报
回复
你自己copy自己是个什么概念Array.Copy(e.Buffer, 0, e.Buffer, e.BytesTransferred, e.BytesTransferred);

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧