UDP/TCP File Transfer

Описание

Два консольных приложения для Windows — Client.exe и Server.exe, которые обмениваются файлами по UDP с подтверждением доставки блоков по TCP.

Особенности:

  • Передача данных по UDP (блоками).
  • Подтверждение доставки (ACK) по TCP.
  • Повторная отправка блоков при таймауте.
  • Завершение передачи по специальному пакету blockNum = -1.
  • Сервер автоматически создаёт директорию для сохранения файлов.

Сборка

git clone https://github.com/Rocket-coder/udp-transfer
cd udp-tranfer
cmake -B build -S .
cmake --build build --config Release

Запуск

Server:

Server.exe <ip> <tcpPort> <directory>

Пример:

Server.exe 127.0.0.1 5555 temp
  • ip — IP-адрес, на котором слушает сервер.
  • tcpPort — TCP-порт для приёма подтверждений.
  • directory — папка для сохранения полученных файлов.

Client:

Client.exe <ip> <tcpPort> <udpPort> <filePath> <timeoutMs>

Пример:

Client.exe 127.0.0.1 5555 6000 test.txt 500
  • ip — IP-адрес сервера.
  • tcpPort — TCP-порт сервера.
  • udpPort — порт для отправки UDP-пакетов.
  • filePath — путь к передаваемому файлу.
  • timeoutMs — таймаут ожидания ACK в миллисекундах.

Общая схема работы

  1. Клиент подключается к серверу по TCP.
  2. Клиент отправляет по TCP:
<fileName> <udpPort>
  1. Сервер создаёт UDP-сокет и ждёт пакеты.
  2. Клиент отправляет файл блоками по UDP:
[blockNum:int][данные]
  1. Сервер после получения каждого блока пишет данные в файл и отправляет по TCP подтверждение с blockNum.
  2. Если клиент не получает ACK за timeoutMs, то он повторяет отправку блока (максимум 5 попыток).
  3. После отправки всего файла клиент отправляет блок с номером -1.
  4. Сервер подтверждает -1, закрывает файл и завершает приём.

Пример работы

Сервер

Server is listening...
Client connected!
Received from client: test.txt 6000
Received block 0 (1024 bytes)
Received block 1 (1024 bytes)
Received block 2 (512 bytes)
File transfer complete!

Клиент

Connected to server!
Sent test.txt 6000 to server
Sent block 0 (attempt 1)
ACK received for block 0
Sent block 1 (attempt 1)
ACK received for block 1
Sent block 2 (attempt 1)
ACK received for block 2
End of file confirmed by server