Прочитав несколько связанных вопросов, я решил использовать библиотеку tpl для сериализации моих структур с целью отправки и получения их через сокеты. У меня проблемы с пониманием, как отправлять и получать изображения TPL с помощью сокетов. Я получаю сообщение об ошибке segfault на стороне сервера при вызове функции tpl_dump
.
Я знаю, что сокеты работают на обоих концах, потому что я использовал код для предварительной отправки строк туда и обратно. Я также смог без проблем использовать tpl для создания и чтения образа tpl на клиенте.
Это не та структура, которую я в конечном итоге хочу посылать взад и вперед, но я надеюсь выяснить этот пример, чтобы я мог сделать это в будущем. Я знаю, что что-то не так между входящим буфером и tpl_dump
. Я все еще изучаю C (о чем свидетельствуют мои предыдущие вопросы), поэтому я прошу прощения, если у меня есть явные ошибки в моем коде.
редактирует
Проблемы, которые указал Николай, были исправлены в коде ниже. Тем не менее, код сервера регистрирует error: tpl_load to non-root node
и все еще имеет ошибки в tpl_unpack(tn, 0);
Код клиента:
tpl_node *tn;
void *addr;
size_t len;
struct ci {
char c;
int i;
};
struct ci sample = {'a', 1};
tn = tpl_map("S(ci)", &sample); /* pass structure address */
tpl_pack(tn, 0);
tpl_dump(tn, TPL_MEM, &addr, &len );
tpl_free(tn);
send(sockfd, addr, len, 0);
Код сервера:
if ((nbytes = recv(i, buf, sizeof buf, 0)) <= 0) {
//error handling
} else {
tpl_node *tn;
struct ci {
char c;
int i;
};
struct ci recieve;
tpl_map("S(ci)", &recieve);
tpl_load(tn, TPL_MEM, &buf, &nbytes );
tpl_unpack(tn, 0);
tpl_free(tn);
На случай, если это пригодится - Руководство пользователя tpl