Обеспечение доставки данных send () - PullRequest
1 голос
/ 27 января 2011

Есть ли способ проверить, действительно ли данные, отправленные с помощью winsock send () или WSASend (), действительно доставлены в пункт назначения?

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

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

Хуже всего то, что я не могу изменить код сервера, поэтому я не могу получить никаких сообщений с подтверждением доставки.

Ответы [ 2 ]

0 голосов
/ 27 января 2011

Извините, но, учитывая то, что вы пытаетесь достичь, вы должны понимать, что даже если стек TCP МОЖЕТ дать вам указание, что конкретный набор байтов был подтвержден ACK удаленным стеком TCP, он не сможет на самом деле не означает ничего, что вы знаете в данный момент.

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

'но я могу предположить, что это достаточно близко'

просто бред. С тем же успехом вы можете сделать такое предположение, если отправка завершена, поскольку она примерно так же действительна.

Проблема в том, что даже если стек TCP может сказать вам, что удаленный стек получил ACK для данных (1), это не то же самое, что удаленное приложение, получающее данные (2), и это не то же самое в качестве удаленного приложения на самом деле ИСПОЛЬЗУЯ данные (3).

Учитывая, что удаленное приложение МОЖЕТ аварийно завершить работу в любой момент, 1, 2 ИЛИ 3, единственным полезным признаком того, что данные поступили, является тот, который отправляется удаленным приложением после того, как оно использовало данные по назначению.

Все остальное - просто желаемое за действительное.

0 голосов
/ 27 января 2011

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

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

...