2014-10-14 3 views
-2

Я пытаюсь отправить пакетное сообщение (имеющее заголовок и массив данных) в UDP. Я на предварительном этапе, не используя данных в сообщении, и я хочу отправить этот заголовок, который представлен структурой struct и вложенным перечислением.Программирование сокетов: отправка пакета по UDP (C++)

Есть ли какой-либо другой способ для передачи данных по UDP-другому, а затем сериализация указанных структур, а затем построение данных буфера и отправка их? существует как процедура буфера в программировании сокета c, C++, которая отправляет пакеты данных

+2

Это более неопределенное, чем –

+2

Вы будете отправлять пакеты, но эти пакеты будут состоять из необработанных байтовых данных в любом случае. Для всех нет стандартной стандартной сериализации. – deviantfan

+1

Мой вопрос был, если у вас сложная структура, сериализует его в буфер, это единственный способ передать его, или есть что-то вроде сериализации Java в C++. – Warrior4just

ответ

0

Если ваш struct выровнен по байтам и использует только типы POD, вы можете передать структуру непосредственно sendto(), не скопировав ее сначала в другой буфер, например :

#pragma pack(push, 1) // or other platform-appropriate pack statement 
struct myHdr 
{ 
    uint8_t type; 
    uint16_t len; 
    //... 
}; 
#pragma pack(pop) 

myHdr hdr; 
hdr.type = ...; 
hdr.len = ...; 
... 

send(fd, &hdr, sizeof(hdr), 0); 

Но эта практика, как правило, нахмурилась. И это не очень полезно после того, как вы начнете добавлять данные. Но вы можете выделить буфер и использовать байт-выровнены struct для заполнения буфера, по крайней мере:

#pragma pack(push, 1) // or other platform-appropriate pack statement 
struct myHdr 
{ 
    uint8_t type; 
    uint16_t len; 
    //... 
}; 
#pragma pack(pop) 

uint8_t buffer[65535]; 
myHdr *hdr = (myHdr*) &buffer[0]; 
hdr->type = ...; 
hdr->len = ...; 
... 
// fill in &buffer[sizeof(myHdr)] onwards as needed 

send(fd, buffer, sizeof(myHdr)+..., 0); 
0

Это именно то, что функция sendmsg() для. Он предоставляет возможность «собирать-писать». Вы предоставляете ему один или несколько (может быть, ноль или более) адресов и длин буфера и собирает их все вместе в одну отправку.

Но вы не должны использовать struct s как сетевые протоколы. Используйте сетевые протоколы в качестве сетевых протоколов. Определите протокол приложения в октетах и ​​напишите себе библиотеку, чтобы упаковать и распаковать ваши структуры в/из потока октетов.

Или используйте XDR или его родственники.

Смежные вопросы