Socket异步通信接收大数据量,接收Buffer溢出问题
服务器采用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);
如果去掉这两行代码,即使只有一个客户端并且发几十字节的数据,过段时间也会报同样的错,咋回事啊?求指教