Вы не считаете, что Socket.Receive
очень хорошо может прочитать меньше байтов, чем длина предоставленного буфера. Возвращаемое значение сообщает вам количество байтов, которые были фактически прочитаны. Я вижу, что вы правильно храните это значение в переменной, но я не вижу ни одного кода, который его использует.
Вы должны быть готовы сделать несколько звонков на Receive
, чтобы получить весь пакет. В частности, когда вы получаете данные пакета.
Я не уверен, что это является причиной вашей проблемы. Но это может быть так, поскольку короткой задержки на стороне клиента может быть достаточно для заполнения сетевых буферов, чтобы весь пакет читался за один вызов.
Попробуйте использовать следующий код для получения данных пакета:
int bufferPos = 0;
while (bufferPos < responseBuffer.Length)
{
bufferPos += socket.Receive(responseBuffer, bufferPos, responseBuffer.Length - bufferPos, SocketFlags.None);
}
Примечание. Вам следует также поддерживать случай, когда первый вызов Receive
(тот, где вы получаете длину данных пакета) не возвращает 4 байта.