Я разрабатываю клиентское и серверное приложение для передачи файлов с сокетами C ++ по UDP (SOCK_DGRAM).Для метода PUT у меня есть следующее выполнение (после рукопожатия):
client
Send a packet;
if time_out
send the packet again;
else //ack received
send a new packet;
server
wait for the first packet;
send acknowledge;
while(!EOF)
Get a packet;
Send an ack;
Где EOF в основном проверяетесли я получил весь файл по сравнению с размером файла, который я посылаю во время рукопожатия.
Пакеты могут быть потеряны в любой момент во время этого обмена.Клиент может отправить пакет данных, который теряется.Время ожидания ACK истечет, и пакет будет отправлен повторно.Сервер получает пакет данных и отправляет ACK.Этот ACK может быть потерян, после чего клиент истекает и повторно отправляет свой пакет данных.Поскольку эти пакеты имеют пронумерованную последовательность, мы можем просто игнорировать пакет, который мы получили несколько раз.
Моя путаница возникает в конце передачи файла.Клиент только что отправил пакет, содержащий последние биты файла.Сервер успешно получает его и отправляет свой ACK.Этот пакет теряется.Серверное приложение теперь находится вне цикла while, потому что он записал последние биты в файл и, с его точки зрения, передача файла прошла успешно.Однако клиент так и не получил ACK, поэтому время ожидания истекло и он повторно отправляет пакет данных.Что здесь должно произойти?Сервер не прослушивает или ожидает новый запрос, а не данные.В какой момент клиент или сервер должны считать передачу завершенной и перестать пытаться связаться?