как фрагментировать пакеты в с ++? - PullRequest
0 голосов
/ 24 марта 2020

Я реализовал протокол MSEX CITP - пока с успехом - в моем проекте для потоковой передачи изображения по сети. Я использую winsocks следующим образом:

v_id = socket(AF_INET, SOCK_DGRAM, 0);
setsockopt(v_id, SOL_SOCKET, SO_BROADCAST, (char*)&isbroad, sizeof(isbroad));
sendto(v_id, temp_buf, v_buffer->o(), 0, address->get(), socksize);

Но для изображения размером более 65 КБ spe c говорит, что я должен фрагментировать свои пакеты и добавить данную «преамбулу».

После некоторых исследований, насколько я понимаю, я должен установить размер MTU и заголовок фрагмента, но все мои попытки терпят неудачу. Может ли кто-нибудь указать мне правильное направление?

1 Ответ

0 голосов
/ 24 марта 2020

MTU означает Maximum Transmission Unit: он представляет размер самого большого PDU (блока данных протокола), который может быть отправлен / получен в одной сетевой транзакции (обычно 1500 байтов для Ethe rnet).

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

Это ограничение заставляет вас явно управлять:

1. sending/receiving фрагментов
2. reconstruction из исходный файл concatenating его различные фрагменты в correct order

Чтобы идентифицировать и управлять вашими фрагментами, вы должны добавить заголовки как meta-data к вашим пакетам. Эти заголовки содержат, например, размер и порядковый номер фрагмента:

---------------------------  
| headers |       data    |
---------------------------  

Благодаря этим заголовкам вы узнаете размер данных для чтения, порядковый номер фрагмента. Что позволит вам восстановить свой образ.

...