Entwurf eines binären Protokoll
Von: Andreas Volz (usenet-spam-trap@brachttal.net) [Profil]
Datum: 17.05.2008 00:23
Message-ID: <20080517002349.6bc3de2c@frodo.mittelerde>
Newsgroup: de.comp.os.unix.programming
Datum: 17.05.2008 00:23
Message-ID: <20080517002349.6bc3de2c@frodo.mittelerde>
Newsgroup: de.comp.os.unix.programming
Hallo, ich möchte Daten zwischen zwei Prozessen austauschen. Dafür nehme ich einen FIFO. Ich habe mir ein Protokoll ausgedacht: 1 byte - header start mark (0xEA) 4 byte - packet size (header+size+payload) ----- payload start ----- 4 byte - id x byte - data ----- payload end ------- Das ganze habe ich in C++ implementiert und es funktioniert soweit gut. Jetzt habe ich ein paar Fragen dazu. Aktuell lese ich auf der Leser-Seite immer ein Byte nach dem anderen. Auf der Schreiber-Seite schreibe ich immer einen Block mit einem write() Aufruf. Derzeit ist das kein Problem, weil es nur wenige Bytes sind. Später habe ich vor auch mal ein paar MB als 'data' zu übertragen. Kann ich da (unter Linux) Probleme bekommen, wenn ich das in einem Rutsch schreibe? Sollte man das in mehrere write() Aufrufe, mit kleinem Puffer, unterteilen? Ein write() Aufruf hat Erfolg und meldet eine bestimmte Anzahl von Bytes zurück. Kann man dann davon ausgehen, dass die bytes auf jeden Fall von der Leser-Seite abgeholt werden? Was passiert, wenn meine Applikation während eines write() Aufrufs auf einen FIFO stirbt? Wird die Leser-Applikation erhalten was bis dahin schon im FIFO drinnen ist oder nichts? Wäre dafür evtl. die Option 'O_SYNC' von open() zuständig? I n der Manpage steht aber es wäre für Linux (Stand: Linux 0.99pl7) nicht implementiert. Um den Hintergrund der Fragen oben etwas zu erklären. Es könnte ja vorkommen, dass das "header start mark" nochmal in einem der anderen Felder vorkommt. Wenn ein write() in einen FIFO auch mal weniger Bytes als verlangt schreiben könnte, dann müsste ich alle Vorkommen von 0xEA im restlichen Paket maskieren. Sonst interpretiere ich u.U. den Start eines neuen Pakets fälschlich als Daten eines vorherigen abgebrochenen Pakets. Gruß Andreas -- Technical Blog <http://andreasvolz.wordpress.com/[ Auf dieses Posting antworten ]
Antworten
- Feix (17.05.2008 13:28)
- Andreas Volz (17.05.2008 22:09)
- Fernando (06.06.2008 12:48)
- Feix (21.06.2008 09:52)
- Christof Meerwald (21.06.2008 16:37)
