2010-12-29 5 views
4

Ich muss lokale IPC zwischen Client und Server einrichten. Es handelt sich um einen einzelnen Server und mehrere Clients, und Daten müssen in beide Richtungen ausgetauscht werden. Der Client ist ein Befehl, der die Befehlsoptionen sendet, und der Server ruft die Daten ab und sendet sie an den Client. Der Client gibt die vom Server empfangene Ausgabe auf der Konsole aus.POSIX-Nachrichtenwarteschlangen oder Unix-Domain-Sockets für lokale IPC

Die vom Befehl gesendeten Daten sind klein, aber die vom Server an den Befehl gesendeten Daten sind sehr groß (~ 11 MB). Das vorhandene Design in Windows sendet die Daten in Abschnitten von 65 Kilobyte mithilfe von Named Pipes. Der Server muss die Daten gleichzeitig an mehrere Befehls-Clients senden, da es üblich ist, Befehle mit verschiedenen Optionen gleichzeitig von verschiedenen Terminals aus auszuführen.

Ich habe FIFO weggelassen, da die Daten von mehreren Prozessen für Nachrichten mit einer Größe von mehr als 4096 Bytes verschachtelt werden können. Bitte korrigieren Sie mich, wenn ich falsch liege.

Unter den folgenden zwei Kriterien, die eine bessere Wahl wäre, POSIX-Nachrichtenwarteschlangen oder Unix-Domain-Sockets?

  1. Größe (65K) der Nachricht
  2. Daten von mehreren Clients nicht verschachtelt werden sollte. Nur an diesen Client adressierte Daten sollten von einem Client empfangen werden.

Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen.

Grüße, Rohini Chandra

Antwort

0

Klingt wie Sie eine Steckdose wollen. Richten Sie den Socket auf dem Server mithilfe von bind ein. Wenn jeder Client eine Verbindung zu ihm herstellt, kann der Server entweder die einzelnen Clients einzeln verarbeiten oder die Clients mithilfe von select verarbeiten. Gabelung ist in der Regel einfacher:

int sock = create and bind the socket to any port 

    while (1) { 
    int client = accept(sock); 
    pid_t pid = fork() 
    if (pid == 0) { 
     // Handle client command 
     exit(0); 
    } 
    } 
+0

Danke für den Vorschlag Daniel. Könnten Sie mir bitte mitteilen, welches der Kriterien, die Sie beabsichtigen, am besten von den Unix-Domain-Sockets bedient wird? Ich bitte um des Lernens willen. –

+0

Sockets werden automatisch verschiedene Client-Datenströme trennen. Jedes Mal, wenn ein Client eine Verbindung herstellt, erstellt der Server einen neuen ephemeren Socket und lässt den ursprünglichen Server-Socket für neue Clients verfügbar. Bei Nachrichtenwarteschlangen müssten Sie Ihre eigene Trennung implementieren. Sockets verwenden auch die Systemaufrufe POSIX-Standard read() und write(), so dass sie von den Betreuern leichter verstanden werden. –

+0

Danke Daniel. Ich dachte, seit Linux Message Queues einen Dateideskriptor geben, wenn eine Nachrichtenwarteschlange geöffnet wird, können wir einen neuen Descriptor für jeden Client haben. Aber damit dies funktioniert, denke ich, dass das Betriebssystem diese Trennung unterstützen sollte, wie Windows Named Pipes von Natur aus tut. Ich war mir nicht sicher, ob Linux-Nachrichtenwarteschlangen damit umgehen. –