2016-05-31 19 views
0

Ich implementiere einen TCP-Client für ein Embedded-System (Zybo), das kein Betriebssystem hat und ich bin völlig neu in LwIP. Nachdem ich eine Weile gegoogelt habe, habe ich einige Beispiele dafür gefunden.LwIP-Implementierung

Ich fragte mich, ob es eine Möglichkeit gibt, C-Strukturen durch sie zu senden und ob es eine Probe gibt. Der Server ist auf einem anderen Zybo-Board unter Linux implementiert und es verwaltet viele Strukturen, um die Zustandsmaschine zu steuern, also ist es ziemlich entscheidend.

Vielen Dank im Voraus.

+0

'irgendeine Möglichkeit, C-Strukturen durch sie' sicher, im Allgemeinen zu senden. Sie benötigen ein Serialisierungsprotokoll über TCP, aber ja, sicher, dass es getan werden kann;) –

Antwort

4

LwIP hat eine TCP-Stack-Implementierung, so dass es (fast?) Alles, was ein regulärer TCP-Stack kann, kann.

Und natürlich ermöglicht es Ihnen, beliebige Daten über den Sockel zu senden. Weder Standard-Stack, noch LwIP hat spezielle Unterstützung für die Serialisierung (was Sie wahrscheinlich wollen).

Sie müssen ein Protokoll für die Serialisierung Ihrer Struktur in ein Array von Zeichen definieren, dieses Array senden, auf der anderen Seite empfangen und deserialisieren. Eine Möglichkeit, eine Struktur zu seralisieren, ist die sogenannte Entity-Serialisierung - senden Sie einfach einen unbearbeiteten Speicher-Footprint der Struktur und empfangen Sie sie auf der anderen Seite. Dies ist sehr einfach, sehr schnell, aber sehr unzuverlässig - was ist, wenn das Speicherlayout der gleichen Struktur zwischen Sender und Empfänger unterschiedlich ist? Es wird auch schwierig, der Struktur neue Felder hinzuzufügen, während sich Ihr Programm entwickelt (Sie müssen sie immer am Ende hinzufügen), und es ist fast unmöglich, ein Feld zu entfernen.

Ein besserer Weg ist es, verschiedene Serialisierungsansätze zu verstehen und die erste zu finden, die am besten zu Ihnen passt.

+0

Gibt es eine API verfügbar, um verschachtelte Strukturen zu serialisieren? –

+0

Google Protocol Buffers (C-Version heißt Protobuf-c) ist eine beliebte Wahl für eine Serialisierungsbibliothek. Ich bin sicher, dass Sie andere, möglicherweise leichter finden können –

-1

wurde das Problem behoben, indem Memcpy Funktion, etwas ähnlich wie diese:

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

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

Nachdem Sie das getan, es das Byte-Array über die Buchse gerade schickt. Wie auch immer, danke für die Hilfe.

+0

Dies ist sehr gefährlich. Wie in der angenommenen Antwort erwähnt wurde, sind C-In-Memory-Strukturen kein definiertes Datenformat und sollten nicht in Anwendungsprotokollen verwendet werden. Ein anderer Compiler kann und wird die Struktur anders auffüllen. Die C-Sprache gibt keine Garantie für die Anzahl der Bytes, die in einem Int enthalten sind, und verschiedene CPUs verwenden unterschiedliche Größen für int (2 Byte gegenüber 4 Byte). –