ashutoshmanshu Ответов: 1

C-код sendmsg () и recvmsg () передают bigdata через UDP в интернете или интрасети


I am trying to send big data more than 1gb over UDP.I try to learn all parameter of sendmsg() and recvmsg() but not get the idea how to fragment and how to again reassemble data using c programming. I search on google every side tell that how to set a parameter in iovec and cmsghdr but no one explain about how to fragment and reassemble data another end.

some example I found that says send a single buffer of data and tell that manage offset based on return value of sendmsg() but I don't think this is the best way of doing.
On completion, I will add feature broadcast so I am only looking P.I know that over TCP problem makes easier but my requirement is UDP. 
please suggest me how to fragment and reassemble data in c language.

and my English not good so sorry for that.


Что я уже пробовал:

typedef struct header_long_t {
    uint32_t magic;
    uint32_t msg_seqno;
    uint32_t msg_size;
    uint32_t fragment_offset;
    uint16_t fragment_no;
    uint16_t fragments_in_msg;
}header_long_t;


но не успех.

1 Ответов

Рейтинг:
0

Jochen Arndt

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

Например, вы можете отправить стартовый пакет, содержащий такую метаинформацию, как общий размер и размер блоков данных. Затем отправляйте данные кусками с заголовком, похожим на тот, что был в вашем вопросе. Получатель выделяет структуру, чтобы знать, какие блоки были получены (с размером = общий размер / размер блока). Затем он записывает каждый полученный блок в файл с заданным смещением и помечает блок как полученный. Это обрабатывает фрагментацию.

Но вам также нужно определить недостающие блоки после тайм-аута и запросить их повторную отправку. Это может быть реализовано с любой стороны: получатель может отправить подтверждение, чтобы отправитель мог пометить блок как успешно переданный, или получатель может запросить отправку недостающих блоков снова после тайм-аута. Я бы выбрал вариант подтверждения.

Вы также должны отправить чековую сумму с каждым блоком. Затем получатель может запросить повторную отправку сразу же после ошибок контрольной суммы.

Но есть протокол, который делает все вышесказанное: TCP.

UDP-это неправильный выбор для ваших требований. Поговорите с теми, кто хочет UDP, и объясните им, что вы должны написать что-то вроде TCP поверх UDP, чтобы полностью выполнить требования. Это было бы, вероятно, медленнее, чем использование TCP, и - что более важно - не так стабильно без обширного тестирования.