2012-03-26 17 views
0

Ich schreibe gerade eine Anwendung mit Vala, die erfordert, dass ich Daten über ein Netzwerk sende. Um beim Erstellen der Pakete zu helfen (und das Protokoll zu späteren Zeitpunkten zu aktualisieren), habe ich Strukturen erstellt, die ich an eine Methode wie void * weitergebe. Diese Strukturen stellen dar, wie das Paket angeordnet ist, und erlauben es mir sehr einfach, ein zu sendendes Paket zu erzeugen, ohne zu viel herumspielen zu müssen. Das Problem dabei ist jedoch, dass der Vala-Wrapper für GLib.OutputStream.write() keine Zählung akzeptiert (obwohl die ursprüngliche Methode dies tut). Vala nimmt die Größe des übergebenen uint8 [] und stellt dies der ursprünglichen Methode zur Verfügung. Gibt es eine einfache Möglichkeit, dies zu umgehen, ohne den GIO vapi zu bearbeiten? Möglicherweise eine sehr billige Möglichkeit, eine Leere * in einen Uint8 [] zu werfen, während eine Größe geliefert wird? Ich strebe eine sehr hohe Leistung an, da die Anwendung Tausende von Verbindungen gleichzeitig aufrechterhalten muss. Vielen Dank im Voraus für jede Hilfe.Schreiben einer Anzahl von Bytes in einen GLib.OutputStream in Vala

~ Michael

Antwort

1

Ich habe ein Makro wie folgt unter Verwendung von:

#define OBJECT_TO_BUFFER(val,type,size) (*(size) = sizeof(type), (guint8*)val) 

, um dieses Problem zu bekommen. Es nimmt Ihr Objekt und gibt einfach den gleichen Speicher zurück wie ein uint8[]. Es hat den entsprechenden Prototyp in Vala:

unowned uint8[] Buffer.of<T>(ref T @value); 

die Header-Dateien und VAPI Datei mit dem Namen „Tricks“ ist in my GitHub. Es gibt ähnliche Versionen für den Umgang mit Arrays von Objekten.

+0

Danke :) Ich werde diese versuchen. Gibt es überhaupt keine Möglichkeit, alles über Vala zu tun? Ich meine, es macht mir nichts aus, einen Header zu verwenden, da nur ich wirklich den Code benutze. Ich frage mich nur, ob es ohne den C-Code gemacht werden kann :) –

1
unowned uint8[] buf = (uint8[]) your_real_buffer; 
buf.length = the_length_you_want; 

Dann senden buf.