До какого момента блокируется NetworkStream.Write? - PullRequest
3 голосов
/ 07 июня 2011

Я могу придумать следующие возможные ответы:

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

Ответы [ 2 ]

3 голосов
/ 07 июня 2011

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

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

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

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

0 голосов
/ 07 июня 2011

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

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

Это отвечает на ваш вопрос?

...