Какой объем буфера у NetworkStream и TcpClient? - PullRequest
5 голосов
/ 28 марта 2010

Мы пишем TCPServer и клиентскую программу. Сколько места в буфере TcpClient? Мол, в какой момент он начнет выбрасывать данные? Мы пытаемся определить, может ли TcpClient блокировать или должен идти в свой собственный фоновый поток (чтобы буфер не мог заполниться) ..

Ответы [ 2 ]

6 голосов
/ 28 марта 2010

Размеры буфера можно получить из TcpClient.ReceiveBufferSize и TcpClient.SendBufferSize .

Доступные размеры буфера будут варьироваться в зависимости от того, получены или подтверждены данные (или нет) на уровне TCP. TcpClient блокируется по умолчанию.

Никакие данные не будут выброшены в результате полных буферов, хотя данные могут быть выброшены в условиях ошибки (например, исчезновение узла / сбой / выход и т. Д.)

3 голосов
/ 28 марта 2010

В документации MSDN указано, что по умолчанию размер send и receive буферов для TcpClient составляет 8192 байта или 8K. В документации не указан предел того, насколько большими могут быть эти буферы.

Как я уверен, вы знаете, что вы отправляете и получаете данные через TcpClient, используя базовый объект NetworkStream. Вы контролируете, являются ли это синхронными или асинхронными операциями. Если вы хотите синхронного поведения, используйте методы Read и Write из NetworkStream. Если вы хотите асинхронного поведения, используйте операции BeginRead / EndRead и BeginWrite / EndWrite.

Если вы получаете данные как часть какого-либо интерфейсного приложения, я настоятельно рекомендую делать это во вторичном потоке, независимо от того, используете ли вы это асинхронными методами или синхронно в отдельном потоке. Это позволит вашему пользовательскому интерфейсу реагировать на пользователя, продолжая обрабатывать отправку и получение данных в фоновом режиме.

...