Какие условия вызывают блокировку NetworkStream.Write? - PullRequest
8 голосов
/ 06 октября 2011

Будет ли NetworkStream.Write блокироваться только до тех пор, пока данные не будут отправлены в буфер отправки TCP, или будет блокироваться до тех пор, пока данные не будут на самом деле подтверждены принимающим хостом?

Примечание. Сокетнастроен на блокировку ввода / вывода.

Редактировать: Упс, нет такой вещи как TcpClient.Write конечно!Мы все поняли, что говорим о TcpClient.GetStream().Write, что на самом деле NetworkStream.Write!

Ответы [ 3 ]

7 голосов
/ 06 октября 2011

Если .net не использует что-то отличное от winsock, то в соответствии со ссылкой на winsock:

Успешное завершение функции отправки не означает, что данные были успешно доставлены и получены получателю.,Эта функция только указывает, что данные были успешно отправлены.

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

Если предположить, что запись вызывает send ниже, то строгая интерпретация документации winsock будет означать, что нет гарантии, что данные вернулись на другой конец канала при возврате.

Вот ссылка на документы Winsock, с которых я цитирую: http://msdn.microsoft.com/en-us/library/windows/desktop/ms741416(v=VS.85).aspx

1 голос
/ 06 октября 2011

Я не согласен с обоими ответами [это состояние, которое он блокирует]. Запись в сокет TCP / IP не блокируется, если базовый буфер уже не заполнен неподтвержденными данными. Обычно он не блокируется, а просто передается реализации TCP. Но, конечно, теперь я должен найти некоторые ссылки, чтобы поддержать это:)

С SO

0 голосов
/ 06 октября 2011

TcpClient.Write будет блокироваться до тех пор, пока буфер пакетов не будет сброшен в сеть и не будут получены соответствующие ACK. Вы заметите, что разорванное соединение обычно приводит к возникновению исключения при операции Write, поскольку оно ожидает ACK, но не получает его в течение определенного периода времени ожидания.

...