У меня есть приложение с сокетом TCP, где я должен прочитать несколько типов ответов, так как максимальный размер буфера 8192, некоторые ответы разделены на несколько пакетов.
В настоящее время я получаю список членов в ответе 44, поэтому первой идеей, с которой мне пришлось иметь дело с разделенными пакетами, было определение потока вне его для хранения входящих данных до тех пор, пока они не будут завершены с помощью bool и переменная текущего размера.
Как только он нажмет ответ 44, он проверит, является ли extraList истиной или ложью, если ложь, это означает, что это начальный запрос к списку входящих участников.
Если 4 начальных байта пакета больше, чем bytes.Legth, который равен 8192, он вызовет extraList для истины и заполнит начальные данные в буфере, который я ранее установил, с общим размером пакета, так как он является размером .
Так как extraList был запущен и стал истинным, чтение пакета попадет в него до тех пор, пока не будут завершены данные, что затем вернет его в значение false и вызовет функцию MemberList с полным списком.
Хотели бы некоторые советы, предложения и т. Д. Для улучшения этого кода.
int storedCurSize = 0;
MemoryStream stored = null;
bool extraList = false;
while (roomSocket.Connected)
{
byte[] bytes = new byte[roomSocket.ReceiveBufferSize];
roomSocket.Receive(bytes);
MemoryStream bufferReceived = new MemoryStream(bytes, 0, bytes.Length);
using (var reader = new BinaryReader(bufferReceived))
{
int packetSize = (int)reader.ReadInt32() + 9;
int reply = (int)reader.ReadByte();
if (reply == 44 || extraList)
{
if (!extraList && packetSize <= bytes.Length)
{
MemberList(bytes);
}
else
{
if (!extraList)
{
stored = new MemoryStream(new byte[packetSize], 0, packetSize);
stored.Write(bytes, 0, bytes.Length);
storedCurSize = bytes.Length;
extraList = true;
}
else
{
if (storedCurSize < stored.Length)
{
int storedLeftSize = (int)stored.Length - storedCurSize;
stored.Write(bytes, 0, (storedLeftSzie < bytes.Length) ? storedLeftSize : bytes.Length);
storedCurSize += (storedLeftSize < bytes.Length) ? storedLeftSize : bytes.Length;
if (storedCurSize >= stored.Length)
{
extraList = false;
MemberList(stored.ToArray());
stored.Close();
}
}
}
}
}
}
}