Реализация LwIP

Я внедряю TCP-клиент для встроенной системы (Zybo), в которой нет ОС, и я совершенно новичок в LwIP. Погуглив некоторое время, я нашел несколько примеров того, как его использовать.

Мне было интересно, есть ли способ отправить через него структуры C и есть ли какой-либо образец. Сервер реализован на другой плате Zybo под Linux и обрабатывает множество структур для управления конечной машиной, так что это очень важно.

Заранее спасибо.


person m.dorian    schedule 31.05.2016    source источник
comment
'любой способ отправки структур C через него ' конечно, в общем. Вам нужен протокол сериализации поверх TCP, но да, конечно, это можно сделать;)   -  person Martin James    schedule 31.05.2016


Ответы (2)


LwIP имеет реализацию стека TCP, поэтому он способен (почти?) на все, что может сделать обычный стек TCP.

И, конечно же, он позволяет отправлять произвольные данные через сокет. Ни стандартный стек, ни LwIP не имеют какой-либо конкретной поддержки сериализации (что вы, вероятно, хотите).

Вам нужно будет определить протокол для сериализации вашей структуры в массив символов, отправить этот массив, получить его на другой стороне и десериализовать его. Одним из способов сериализации структуры является так называемая entity-serialization — просто отправьте необработанный объем памяти структуры и получите его на другой стороне. Это очень простой, очень быстрый, но очень ненадежный способ - что, если расположение памяти одной и той же структуры у отправителя и получателя отличается? Также становится трудно добавлять новые поля в структуру по мере развития вашей программы (вам всегда придется добавлять их в конце), и почти невозможно удалить поле.

Лучший способ — действительно понять различные подходы к сериализации и выбрать тот, который подходит вам лучше всего.

person SergeyA    schedule 31.05.2016
comment
Есть ли доступный API для сериализации вложенных структур? - person m.dorian; 01.06.2016
comment
Google Protocol Buffers (версия C называется protobuf-c) — популярный выбор для библиотеки сериализации. Я уверен, что вы можете найти другие, возможно, более легкие - person Joel Cunningham; 20.08.2016

Решил проблему с помощью функции memcpy, что-то вроде этого:

typedef struct{
    int ID;
    char name [100];
    int order;
}MESSAGE;

MESSAGE msg;
char b [sizeof(MESSAGE)];
memcpy(b, &msg, sizeof(MESSAGE));

После этого он просто отправляет массив байтов через сокет. В любом случае спасибо за помощь.

person m.dorian    schedule 03.06.2016
comment
Это очень опасно. Как упоминалось в принятом ответе, структуры C в памяти не являются определенным форматом данных и не должны использоваться в протоколах приложений. Другой компилятор может и будет дополнять структуру по-другому. Язык C не гарантирует количество байтов, которые будут в int, и разные процессоры будут использовать разные размеры для int (2 байта против 4 байтов). - person Joel Cunningham; 20.08.2016