Übertragen (Serialisieren) von Objekten ist nicht trivial.
Den Zeiger uint8_t * payload brauchst du nicht zu übertragen, wohl aber die Größe der payload ( und den Inhalt, natürlich ).
Dwer Zeiger muss dann beim Erzeugen eines PACKET neu erstellt werden.
In C macht man es alternativ gern auch mal so, dass die struct packet ihre eigene variable Größe enthält und die payload Daten selbst, statt eines Zeigers darauf:
struct PACKET {
uint8_t size; // Gesamtgröße eines PACKET incl. payload
uint8_t header;
uint8_t length; // mir unklar, ob das redundant ist
uint8_t function;
uint8_t multivar;
uint8_t source[4];
uint8_t destination[4];
uint8_t payload[1]; // variable Größe
};
size kannst du beim Empfangen nehmen um dir den erforderlichen Speicher zu besorgen,
und um zu wissen, wieviele bytes ( inkl. payload ) kopiert werden müssen.
sizeof macht dann natürlich nicht viel Sinn...