При чтении данных по сети вы указываете буфер для приема данных:
byte[] b = new byte[4096];
socket.Receive(b);
Теперь моя первая мысль - это, конечно, повторно использовать приемный буфер, объявив его как переменную-член класса. Моя следующая проблема заключается в том, что я не получил все ожидаемые данные, поэтому мне нужно буферизовать свои данные. Это легко сделать, отслеживая количество полученных байтов и указав смещение:
socket.Receive(m_ReceiveBuffer, count, m_ReceiveBuffer.Length - count);
Теперь проблема в том, что если этого все еще недостаточно, я предполагаю, что мне нужно увеличить буфер, что означает копирование памяти, и продолжать получать в этот буфер. Если предположить, что что-то пошло не так, этот буфер продолжит расти, и, если будут получены достаточно большие сообщения, системе будет не хватать памяти.
Есть идеи, как правильно с этим справиться? Есть ли лучший способ получения данных, чем просто заполнение, копирование, увеличение, заполнение, копирование, увеличение, о котором я говорю?