Два консольных приложения для 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 ReleaseServer.exe <ip> <tcpPort> <directory>Пример:
Server.exe 127.0.0.1 5555 tempip— IP-адрес, на котором слушает сервер.tcpPort— TCP-порт для приёма подтверждений.directory— папка для сохранения полученных файлов.
Client.exe <ip> <tcpPort> <udpPort> <filePath> <timeoutMs>Пример:
Client.exe 127.0.0.1 5555 6000 test.txt 500ip— IP-адрес сервера.tcpPort— TCP-порт сервера.udpPort— порт для отправки UDP-пакетов.filePath— путь к передаваемому файлу.timeoutMs— таймаут ожидания ACK в миллисекундах.
- Клиент подключается к серверу по TCP.
- Клиент отправляет по TCP:
<fileName> <udpPort>- Сервер создаёт UDP-сокет и ждёт пакеты.
- Клиент отправляет файл блоками по UDP:
[blockNum:int][данные]- Сервер после получения каждого блока пишет данные в файл и отправляет по TCP подтверждение с
blockNum. - Если клиент не получает ACK за
timeoutMs, то он повторяет отправку блока (максимум 5 попыток). - После отправки всего файла клиент отправляет блок с номером
-1. - Сервер подтверждает
-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