При использовании блокирующего TCP-сокета мне не нужно указывать размер буфера. Например:
using (var client = new TcpClient())
{
client.Connect(ServerIp, ServerPort);
using (reader = new BinaryReader(client.GetStream()))
using (writer = new BinaryWriter(client.GetStream()))
{
var byteCount = reader.ReadInt32();
reader.ReadBytes(byteCount);
}
}
Обратите внимание, как удаленный хост мог отправлять любое количество байтов.
Однако, при использовании асинхронных TCP-сокетов, мне нужно создать буфер и таким образом жестко закодировать максимальный размер:
var buffer = new byte[BufferSize];
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, callback, null);
Я мог бы просто установить размер буфера, скажем, 1024 байта. Это сработает, если мне нужно только получать небольшие порции данных. Но что, если мне нужно получить сериализованный объект размером 10 МБ? Я мог бы установить размер буфера 10 *1024* 1024 ... но это потратило бы постоянные 10 МБ ОЗУ на время работы приложения. Это глупо.
Итак, мой вопрос: Как эффективно получать большие порции данных с помощью асинхронных TCP-сокетов?