2014-10-24 1 views
0

Я пытаюсь реализовать простой сервер мгновенного обмена сообщений и подошел со следующей проблемой:Исполнительного пакет подтверждение

Как я могу реализовать протокол с пакетом подтверждения?

Я думаю, что это может быть реализована следующим образом:

>> client sends packet with ACKID and waits for ACKID to arrive 
<< server receives packet and sends the same ACKID back 
now the client knows the packet was fully delivered. 

Но в этой концепции, клиент будет блокировать до тех пор, ACKID не был отправлен обратно, и если другой пакет прерывает этот процесс, то клиент будет блокировать навсегда (или до тех пор, пока не произойдет таймаут).

+0

Ответ прост; вы не блокируете. Нет причин блокировать. Вы можете дождаться ACK и таймаута, если это займет слишком много времени. –

+0

@EdS. Можете привести пример, пожалуйста? – d3L

+0

Почему другой пакет прерывает этот процесс? Только сверстник может отправить вам. – EJP

ответ

1

Я предполагаю, что вы отправляете данные, как это на данный момент:

Send("mydata"); 

Теперь это сделать:

Send("mydata"); 
auto ack = Receive(); 
assert(ack == "data acknowledged"); 

(В псевдо-коде).

Использовать таймаут для обеих операций. Только когда Получатель завершает без ошибок, вы знаете, что данные были получены.

Тот же принцип может быть переведен на асинхронные IO API. Это несущественно для вопроса.

(Перестаньте говорить о «пакеты» в контексте TCP TCP не знает, что это такое.).