MSG_READALL - это recv () как ??это отправить () - PullRequest
0 голосов
/ 30 ноября 2010

со страницы руководства recv(2):

MSG_WAITALL

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

Не похоже, что есть эквивалентный флаг для send(2), что мне кажется странным. Может быть, send() гарантированно всегда принимает весь буфер, но я не вижу, чтобы это было записано где-либо (и в любом случае, это кажется мне маловероятным).

Есть ли способ указать send() дождаться, пока не будет отправлен весь буфер, прежде чем вернуться, что эквивалентно recv() MSG_WAITALL?

Редактировать: Я понимаю, что send () просто копирует данные в буфер в операционной системе, и я не могу заставить send () поместить данные в провод. У меня вопрос: могу ли я принудительно заставить send () блокироваться, пока все данные, которые я ему передал, не будут скопированы в буфер ОС?

Ответы [ 2 ]

0 голосов
/ 30 ноября 2010

send(2) для TCP на самом деле ничего не «отправляет» по проводам, а помещает ваши байты в буфер отправки сокета. Он сообщает вам, сколько байтов удалось скопировать туда в возвращаемом значении.

Увеличьте размер буфера отправки (см. setsockopt(2) и tcp(7)), обратите внимание на возвращаемое значение системного вызова. В любом случае, TCP - это поток. Вам нужно самостоятельно управлять протоколом уровня приложения.

0 голосов
/ 30 ноября 2010

Вы не можете . send просто выгружает буфер в ядро, а затем возвращает.

Цитировать из стандарта Unix :

Функция send() должна инициировать передачу сообщения из указанного сокета его равноправному узлу (...) Успешное завершение вызова send () не гарантирует доставку сообщения.

Обратите внимание на слово «инициировать». На самом деле он ничего не отправляет, а говорит операционной системе отправить сообщение, когда оно к нему готово (когда его буферы заполнены или по прошествии некоторого времени).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...