IPC Pipes : Client - Server

09/12/2015 14:00 Daifoku#1
Hey,

Ich habe einen Server (QApplication Gui) und 1-10 Clients (DLL QCoreApplication)
die Clients detouren send() und recv().
Die Clients müssen untereinander kommunizieren, also habe ich auf pipes zurückgegriffen.

Wie realisiert man den Datenverkehr über pipes am besten ?

Möglichkeit 1:
Ich sende alle Daten von recv() über die Pipe zum Server und der Server verarbeitet diese Daten und reagiert entsprechend.
Evtl 4 Pipes ? _SEND_IN, _SEND_OUT, _RECV_IN, _RECV_OUT ?

Möglichkeit 2:
Die Auswertung von recv() findet im Clienten statt.
Dazu müsste der Server dem Clienten mitteilen, was genau bei welchem Packet passieren soll. Anschließend muss der Client reagieren und ggf. eine Nachricht an den Server schicken.

Ich tendiere zu Möglichkeit 1.. weniger Aufwand aber größerer overhead.
Wie würdet ihr sowas realisieren ? Evtl sogar über eine andere Variante ?
09/12/2015 18:37 warfley#2
Ich würde schlicht weg gar nicht mit Pipes arbeiten, Pipes sind langsam wie sonst was.

Ich würde Shared Memory nehmen und die Synchronisation über Semaphores regeln. Ich habe das zwar bisher nur auf POSIX Systemen gemacht, sollte aber auch unter Windows möglich sein. Etwa so (Pseudo):
Code:
//shared semaphores
semaphore writeable;
semaphore server_readable;
semaphore client_readable;

//Natürlich noch initialisieren der semaphores etc
//Initialisierung: 
//       writeable: 1
//       server_readable: 0
//       client_readable: 0

...

// Client recive:
// Warten bis Memory frei zum schreiben ist
wait(writeable);
writedata(shared_mem_pointer, data); //Daten in shared Memory block schreiben
//server bescheid geben er soll arbeiten
signal(server_readable);
//warten bis server fertig ist
wait(client_readable);
readdata(shared_mem_pointer, &data_processed)
//Memory frei
signal(writeable);
//Daten wurden verarbeiten

...

// Server
//warten bis daten ankommen
wait(server_readable);
// daten verarbeiten
processdata(shared_mem_pointer);
// client sagen dass die Verarbeitung fertig ist
signal(client_readable);
09/12/2015 22:13 Daifoku#3
Nun gut, das beantwortet meine Frage indirekt. Also möglichst keine unnötigen Daten senden.

QtSharedMemory und QtLocalServer arbeiten laut einem Test einer dritten Person mit fast identischer Geschwindigkeit ;-) Daher spare ich mir die Umstellung von Pipes auf SharedMemory und sende nur wenige Signale.

Wenn ich mal mehr Zeit haben sollte, kann ich immer noch wechseln. Habe meine Pipe Klasse schön geschrieben, dass ich sie relativ "leicht" an SharedMemory anpassen kann