struct über winsocket, gut oder schlecht?
-
hi!
es geht eigentlich um das senden von nachrichten von nem mikrocontroller an 2 clients...hab mal ne frage, wenn ich zb.: ne struct über einen socket sende wie schaut das auf der leitung aus?? und wie kann man die nachricht bei einem client wieder decodieren?
struct block { int read_write; int adress[4]; int numer_of_data[3]; }; int main() { // Protokollarray block b1[3] = { {1, {0, 0, 0, 1}, {0, 1, 0}}, // Lese von Adresse1 bis Adresse2 {1, {1, 0, 0, 1}, {0, 1, 0}}, // Lese von Adresse2 bis Adresse3 {1, {0, 2, 0, 1}, {0, 1, 0}} // Lese von Adresse3 bis Adresse4 }; m_client.send(/******/); Lese von Adresse1 bis Adresse2 Nachricht schicken
hab bei nem programm mal gesehen:
FileInfo fileInfo; strcpy(fileInfo.name, fileTitle.c_str()); Datei.seekg (0, std::ios::end); fileInfo.size = Datei.tellg(); Datei.seekg (0, std::ios::beg); socket.send(reinterpret_cast<char*>(&fileInfo), sizeof(fileInfo));
darf mal das machen?
-
erstmal "reinterpret_cast" sieht mit nach c++ aus, weil die eckigen klammern nach templates aussehen. hier in ansi c wird höchstens normal gecastet.
wie willst du sockets und ne verbindung zu einem microcontroller mischen?
wenn du ein struct sendest, werden die rohen bytes gesendet. kannst dir dein struct ja mal byte/char-weise anschauen und mit printf("%2x", ..) ausgeben lassen (mit for loop und nem pointer drübergehen).
wie ein struct ausgelegt ist, ist compiler- und plattformabhängig.
-
Generell ist eine struct hier eher ungeeignet.
Denn bei einer struct können füll-bytes zwischen den einzelnen Elementen liegen.Lieber ein Protokoll definieren und die Daten dementsprechend senden, sonst bekommt man sehr schnell probleme, wenn mal ein Client oder Server mit einer anderen Sprache/Compiler geschrieben werden soll...
-
Shade Of Mine schrieb:
Denn bei einer struct können füll-bytes zwischen den einzelnen Elementen liegen.
Das bekommt man mit #pragma pack(1) bzw __attribute__((packed)) weg. Aber die "Byte Order" bleibt maschinenabhängig und sizeof(int) ebenfalls. Deshalb leg genau fest wie groß die Felder sind, welche "Endianess" das Ganze hat und dann behandle es als Byte-Array.