C#如何处理大字节数组?
我正在TCP客户端中接收数据包,其工作原理如下: 服务器发送一个数据包,其中前两个字节是数据包大小信息。 例如:0C 00=12字节长度。 但是,有一个问题(经常发生),服务器在同一个缓冲区中发送大量“数据包”,有时缓冲区缺少将到达下一个缓冲区的字节。 我现在有什么: 带有Send/Recv的简单tcp套接字。 用于处理字节的列表,其中我使用.AddRange添加字节。 “切割”数组后的后处理 它是有效的,但有时事情并不正确(客户看起来好像忽略了数据包) 对不起,我的英语不好,这是我的代码:C#如何处理大字节数组?,c#,sockets,tcp,C#,Sockets,Tcp,我正在TCP客户端中接收数据包,其工作原理如下: 服务器发送一个数据包,其中前两个字节是数据包大小信息。 例如:0C 00=12字节长度。 但是,有一个问题(经常发生),服务器在同一个缓冲区中发送大量“数据包”,有时缓冲区缺少将到达下一个缓冲区的字节。 我现在有什么: 带有Send/Recv的简单tcp套接字。 用于处理字节的列表,其中我使用.AddRange添加字节。 “切割”数组后的后处理 它是有效的,但有时事情并不正确(客户看起来好像忽略了数据包) 对不起,我的英语不好,这是我的代码: b
bufferList = new List<byte>();
private void WaitData(IAsyncResult ar)
{
try
{
Int32 size = socket.EndReceive(ar);
if (size > 0)
{
Array.Resize(ref buffer, size);
bufferList.AddRange(buffer);
dataProcessor();
}
}
catch (Exception ex)
{
Functions.logMessage(logger, "Erro no wait data " + ex.Message, 1);
}
finally
{
buffer = new byte[100000];
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, WaitData, null);
}
}
public void dataProcessor() //byte[] data
{
while (bufferList.Count > 0)
{
int size = (Int32)(BitConverter.ToInt16(bufferList.Take(2).ToArray(), 0));
postProcess(bufferList.Take(size).ToArray());
bufferList.RemoveRange(0, size);
}
}
bufferList=newlist();
私有void WaitData(IAsyncResult ar)
{
尝试
{
Int32大小=套接字.EndReceive(ar);
如果(大小>0)
{
调整数组大小(参考缓冲区,大小);
bufferList.AddRange(缓冲区);
数据处理器();
}
}
捕获(例外情况除外)
{
功能。logMessage(记录器,“错误无等待数据”+ex.Message,1);
}
最后
{
缓冲区=新字节[100000];
socket.BeginReceive(buffer,0,buffer.Length,SocketFlags.None,WaitData,null);
}
}
public void dataProcessor()//字节[]数据
{
而(bufferList.Count>0)
{
int size=(Int32)(BitConverter.ToInt16(bufferList.Take(2.ToArray(),0));
后处理(bufferList.Take(size.ToArray());
bufferList.RemoveRange(0,大小);
}
}
您正在使用.net core吗?如果是这样的话,看看System.Memory.Span
哦,我来看看。谢谢