Передавать структуру с указателями в ней бесполезно.Сами указатели будут отправляться через, но , а не на то, на что они указывают.
Что вам нужно сделать, это упорядочить данные для передачи, то, что различные механизмы RPC (OPC, DCE,и т. д.) очень хорошо справляются.
Если вы не можете использовать установленный метод, подобный этому, это в основном вопрос прохождения структуры элемента за элементом, копирования целей в буфер назначения.
Например, со структурой:
struct person {
int age;
char *name;
char *addr;
} p;
вы можете сделать что-то вроде:
msgbuff = outbuff = malloc (
sizeof (int) +
strlen (p.name) + 1 +
strlen (p.addr) + 1
);
if (msgbuff != NULL) {
*((int*)outbuff) = p.age; outbuf += sizeof (p.age);
strcpy (outbuff, p.name) ; outbuf += strlen (p.name) + 1;
strcpy (outbuff, p.addr) ; outbuf += strlen (p.addr) + 1;
// Send msgbuff
free (msgbuff);
} else {
// Some error condition.
}
Обратите внимание, что int
передается напрямую, так как это в структуре.Для символьных указателей (строки C) вы должны получить цель указателя, а не сам указатель.
По сути, вы преобразуете:
p: age (46)
name (0x11111111) --> 0x11111111: "paxdiablo"
addr (0x22222222) --> 0x22222222: "Circle 9, Hades"
|--------------------|-------------------------------|
structure memory <- | -> other memory
в:
msgbuff (0x88888888) -> {age}{"paxdiablo"}{"Circle 9, Hades"}
Это немного усложняет процесс, так как вам также нужно разархивировать на другом конце, и вам нужно следить за системой, которая имеет int
типы разных размеров.Но в основном так и делается.