Message Queue mit variabler Nachrichtengröße
-
Hallo zusammen,
zu message queues unter Linux gibts ja einige Beispiele im Internet. Nun habe ich aber ein Problem, das ist bisher nicht lösen konnte. Kann ich anstatt Nachrichten fester Größe, Nachrichten variabler Größe nutzen? Mir fällt einfach keine Lösung ein.
Beispiel für Nachricht fester Größe:
... struct q_type { long mtype; char mtext[81]; }q_entry; q_entry.mtype=1; ... msgsnd(msgqid,&q_entry,81,0);
Hat Jemand eine Idee? Einfach einen Pointer und entsprechend Speicher reservieren funktioniert ja nicht.
Gruß
Gustav
-
Schreib doch am Anfang von jeder Message die Länge der Nachricht, dann bist du nicht mehr auf fixe Größen angewiesen.
-
Klar kann ich die Nachrichtenlänge noch mit angeben aber das Problem bleibt. Ich brauch ja entweder ein Array variabler Länge oder einen Pointer auf dynamisch allorcierten Speicher (was aber in diesem Fall nicht brauchbar ist, oder lieg ich Falsch?).
Klar, ich könnte das Struct grundsätzlich mit einem Array fester Größe anlegen, dessen Größe großzügig gestalltet ist und beim Senden nur x Byte in die Queue schieben. Doch dann ergibt sich ein Problem beim Empfangen:int msgrcv(int msqid, struct msgbuf *msgp, int msgsz, long mtype, int msgflg)
The third argument (msgsz) represents the size of the message buffer structure, excluding the length of the mtype member
Wie weiß ich vor dem Empfang der Nachricht wie lange die Nachricht ist?
Vielleicht ist das Problem nun verständlicher.
Gruß
Gustav
-
Wenn du zB sagst, dass die ersten 4 Byte die Länge definiert, dann liest du eben erst die ersten 4 Byte der Nachricht und dann entsprechend den Rest...
-
Aber wenn ich nun mit msgrcv(...) eine Nachricht nur mit mit der Längenangabe auslese, wird diese doch trotzdem aus der Queue gelöscht oder nicht? D.h. ich komme an die wirklichen Daten danach nicht mehr ran. Wenn ich flasch liege bitte berichtige mich. Vielleicht hast du ja ein prinzipielles Beispiel dafür.
Gruß
Gustav
-
Wenn du immer die komplette Nachricht lesen musst, dann schick halt zwei Nachrichten. Immer eine Nachricht mit ner fixen Größe, die die Länge der nächsten enthält
Alternativ ginge auch größere Nachrichten auf mehrere kleine Nachrichten mit fester Größe aufzuteilen. Du schickst zB immer ein Flag mit das sagt, ob die Daten der nächsten Nachricht noch zu der Nachricht gehören.