что происходит, когда я пишу данные гнезду блокирования, быстрее, чем другая сторона читает?

предположите, что я пишу данные действительно быстро [у меня есть все данные в памяти] к гнезду блокирования. далее предположите, что другая сторона прочитает данные, очень медленные [как сон 1 секунда между каждым прочитанным].

каково ожидаемое поведение на стороне письма в этом случае? операция записи заблокировала бы, пока другая сторона не читает достаточно данных, или будет написать возвращение ошибка как сброс связи?

17
nl ja de
@wildplasser ' Связь перезагружается peer' условие TCP, происходящее в OS. Любая библиотека, которая сообщает что когда это isn' t верный должен быть немедленно покрыт дерном. I' ve никогда не слышал об одном.
добавлено автор EJP, источник
Если то, что вы действительно спрашиваете, - то, почему вы делаете пересадку сброс, обычная причина состоит в том, что вы написали связи, которая была уже закрыта пэром.
добавлено автор EJP, источник
Это заблокирует однажды ваш side' s буфера достаточно полны.
добавлено автор wildplasser, источник
Библиотека может сделать то, чего она желает. И это может или не может быть связано с государством гнезда в тот момент.
добавлено автор wildplasser, источник
@EJP: Я знаю то, что это означает. То, что я хотел сказать, что это - "сброс связи" errno, полностью не связано с вопросом в OP (блокирование может прочитать блок?) Библиотека - в лучшем случае не важна, и - в худшем случае дефектный.
добавлено автор wildplasser, источник
@wildplasser это - то, что я думал, произойдет также, однако I' m использование постепенно C++ освобождает, чтобы сделать просто, что, и операция записи бросает исключение связи, перезагруженной пэром...
добавлено автор Aviad Rozenhek, источник

2 ответы

Для гнезда блокирования, посылают() , требование заблокирует, пока все данные не были скопированы в буфер сетевого стека для той связи. Это не должно быть получено другой стороной. Размер этого буфера зависящий от реализации.

Данные очищены от буфера, когда отдаленная сторона признает его. Это - вещь OS и не зависит от отдаленного применение на самом деле чтение данных. Размер этого буфера также зависящий от реализации.

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

В обоих случаях у маленьких систем (как встроенные системы) могут быть буфера нескольких KB, или у и современных серверов меньшего размера могут быть буфера нескольких MB или больше.

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

Вы не получите "ошибку" сброса связи (от OS - библиотеки могут сделать что-либо), если связь на самом деле не становится перезагруженной.

So... It really doesn't matter how quickly the remote application is reading data until you've sent as much data as both local & remote buffer sizes combined. After that, you'll only be able to send() as quickly as the remote side will recv().

26
добавлено
Поступающие и коммуникабельные буфера ("окна") абсолютно независимы. Киоск в одном направлении не препятствует движению в другом направлении.
добавлено автор Brian White, источник
хороший ответ. с отдаленным (клиент), местный (сервер) в памяти, если отдаленный буфер полон, он может все еще быть в состоянии послать данные местному жителю? прочитан и буфер записи разделяется или отдельный?
добавлено автор WorM, источник

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

Как посылают страницу руководства, говорит:

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

Look at this: http://manpages.ubuntu.com/manpages/lucid/man2/send.2.html

6
добавлено
OS удаляет пакет из послать буфера, только если это получило подтверждение it' s поставленный. Если приемник никогда не общается, пакет правильно послали (ответ с ACK после получения ДАННЫХ О ТОЛЧКЕ), буфер отправителя никогда не освобождается.
добавлено автор Davide Berra, источник
хм, что происходит, когда послать буфер большой [говорит 1 МБ], но получить буфер очень маленький [говорят, что 10 байтов] и писатель заполняют послать буфер, и читатель ничего не читает?
добавлено автор Aviad Rozenhek, источник