Linux TCP-сокет в режиме блокировки - PullRequest
3 голосов
/ 31 октября 2011

Когда я создаю сокет TCP в режиме блокировки и использую функции send (или sendto), когда вызов функции вернется?

Придется ли ждать, пока данные на другой стороне сокета получат? В таком случае, если в Интернете возникла пробка, может ли он долго блокироваться?

1 Ответ

3 голосов
/ 31 октября 2011

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

Успешная отправка данных не является гарантией того, что принимающая сторона получила их.

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

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

Если запись выполнена частично успешно (получатель закрыл сокет, выключил его или произошла ошибка), тогда запись может вернуть меньше байтов, чем вы предполагали.Последующая запись должна давать ошибку или возвращать 0 - такие условия не являются необратимыми в сокетах TCP.

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

...