2011-01-26 2 views
1

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

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

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

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

ответ

0

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

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

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

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

Проблема заключается в том, что даже если стек TCP может сказать вам, что в удаленном стеке были ACK'd данные (1), это не то же самое, что удаленное приложение, получающее данные (2), и это не то же самое как удаленное приложение, фактически использующее данные (3).

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

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

+0

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

+0

Поскольку это бредовое, почему бы просто не притвориться, что он ... –

0

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

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

+0

Протокол TCP имеет значения, поэтому уровень TCP точно знает, получила ли другая сторона данную часть отправленного сообщения - нет ли какой-либо возможности получить эту информацию? Я знаю, что выделение всего сообщения другим стеком TCP не означает его чтение и обработку приложением, но я могу предположить его достаточно близко. Я не могу изменить протокол приложения, как его сторонний сервер. – miara

+0

Эта информация не распространяется на API, и, как вы сказали, это не означает, что сервер считывал ее из * своих * буферов и обрабатывал ее. – CoreyStup

Смежные вопросы