导航
  • 主页
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm
  • WPF
  • 问答

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);
如果去掉这两行代码,即使只有一个客户端并且发几十字节的数据,过段时间也会报同样的错,咋回事啊?求指教
...全文
208 点赞 收藏 4
写回复
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);
回复
发动态
发帖子
C#
创建于2007-09-28

10.4w+

社区成员

.NET技术 C#
申请成为版主
社区公告

全世界最好的语言,没有之一.