До каких пор блокируется NetworkStream.Write?

Я могу думать об этих возможных ответах:

  • Пока данные не будут записаны в какой-то внутренний буфер в стеке IP.
  • Пока данные не будут отправлены по сети.
  • Пока не будет получено подтверждение приема от другой машины.

person Ansis Māliņš    schedule 07.06.2011    source источник


Ответы (2)


Пока данные не будут записаны в буфер отправки на стороне отправителя.
Таким образом, если буфер заполнен, он будет заблокирован.

Буфер отправки может быть заполнен, если он еще не передал данные из-за проблем с сетью или из-за того, что буфер приема заполнен на стороне получателя.

Вы можете провести эксперимент: создать отправителя и получателя, установить буфер отправки сокета отправителя на что-то маленькое, а буфер приема получателя на что-то маленькое.

Начать отправку, принять соединение на стороне получателя, но не получать. Сокет будет заблокирован, когда количество отправленных байтов будет равно SenderSendBuffer + ReceiverReceiveBuffer.

person Alex Aza    schedule 07.06.2011

NetworkStream не буферизует данные. В конечном итоге вызов NetworkStream.Write преобразуется в сокет send вызов функции. Статья MSDN для этой функции гласит:

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

Отвечает ли это на ваш вопрос?

person Andrew Savinykh    schedule 07.06.2011
comment
NetworkStream не буферизует данные, но Socket.Send помещает данные во внутренний буфер. - person Alex Aza; 07.06.2011
comment
@Alex Aza: я смотрю на это с отражателем, и нет, это не так. Я смотрю на реализацию .net 4.0, о какой версии .net вы говорите? - person Andrew Savinykh; 07.06.2011
comment
Но что делает базовая реализация? То есть буферизует ли стек Windows IP данные в течение короткого периода времени? - person Jim Mischel; 07.06.2011