Как я могу явно ждать TCP ACK, прежде чем продолжить? - PullRequest
6 голосов
/ 22 ноября 2011

Есть ли способ заставить send () ждать, пока все отправленные данные не будут обработаны ACK (или вернуть -1, если истекло время ожидания ACK), или есть какой-то другой механизм для ждать подтверждения после send (), но прежде чем делать что-то еще?

Я использую стандартный API сокетов Unix Berkeley.

Я знаю, что мог бы реализовать ACK прикладного уровня, но я бы предпочел этого не делать, когда ACK TCP отлично подходит для этой цели.

Ответы [ 4 ]

5 голосов
/ 22 ноября 2011

AFAIK нет пути.

Кроме того, это не будет надежно, ACK означает только то, что ядро ​​получило данные, в то время как клиент или его машина могли произойти сбой.Можно подумать, что клиент получил данные, но на самом деле он никогда не обрабатывал их.

4 голосов
/ 22 ноября 2011

К сожалению, стандартный API не оставляет за собой никакого подходящего способа сделать это. может быть способом запроса текущего размера / использования окна отправки TCP, но, к сожалению, его нельзя запрашивать стандартными средствами.хочу.Например, в Windows можно создать драйвер сетевого фильтра для мониторинга трафика на уровне пакетов.

2 голосов
/ 28 октября 2013

Кажется, я нашел решение. По крайней мере, в Linux, если для SO_SNDBUF установлено значение 0, кажется, что он ожидает каждую транзакцию, прежде чем разрешить следующую передачу. Хотя он немедленно вернется, он не сможет разрешить другую отправку, пока предыдущая отправка не будет отправлена. Я не пытался использовать select (...), чтобы определить, были ли отправлены данные.

Это работает на моем ядре Linux 3.8, и я уверен, что оно работает в другом месте.

0 голосов
/ 24 февраля 2016

Вы можете написать обертку для send (). Я ответил на вопрос, подобный этому, в другой теме .

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