我正在我的TCP客户端中接收数据包,这是这样的: 服务器发送一个数据包,其中前两个字节是数据包大小信息。 例如:0C 00 = 12个字节的长度。 但是,有一个问题(可能很多),服务器在同一缓冲区中发送了很多“数据包”,有时缓冲区中缺少将要到达下一个缓冲区的字节。 我现在有什么: 一个带有发送/接收的简单tcp套接字。 一个处理字节的列表,其中我使用.AddRange添加字节。 剪切数组后的后处理。
它可以工作,但是有时候没事(客户端看起来就像忽略数据包) 对不起,我的英语不好,这是我的代码:
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);
}
}