Я работаю над проектом, который включает связь между клиентом и сервером через TCP и буфер протокола Google. На стороне клиента я в основном использую NetworkStream.Read() для блокировки чтения с сервера через буфер массива байтов.
Согласно документации MSDN,
Этот метод считывает данные в параметр буфера и возвращает количество успешно прочитанных байтов. Если данных для чтения нет, метод Read возвращает 0. Операция Read считывает столько данных, сколько доступно, вплоть до числа байтов, указанного параметром размера. Если удаленный узел разрывает соединение и все доступные данные получены, метод чтения завершается немедленно и возвращает нулевые байты.
То же самое и с асинхронным чтением (NetworkStream.BeginRead и EndRead). Мой вопрос в том, когда возвращается Read()/EndRead()? Похоже, он вернется после того, как все байты в буфере будут заполнены. Но в моем собственном тестировании это не так. Байты, прочитанные за одну операцию, сильно различаются. Я думаю, что это имеет смысл, потому что, если на стороне сервера есть пауза при отправке сообщений, клиент не должен ждать, пока буфер чтения заполнится. Есть ли у Read()/EndRead() какой-то механизм тайм-аута?
Я пытался выяснить, как Mono реализует Read() в NetworkStream и отслеживал до тех пор, пока не будет вызван внешний метод Receive_internal().