Ich habe an einem komplexen Server-Client-System in C gearbeitet und bin mir nicht sicher, wie ich die Socket-Kommunikation implementieren soll.
Kurz gesagt ist das System eine Serveranwendung, die mit einer Datenbank kommuniziert und einen UNIX-Socket zur Kommunikation mit einem oder mehreren Kindprozessen verwendet, die mit fork()
. Der Zweck der Kinder ist es, Spieleserver zu betreiben. Der Prozess des Starts eines Spieleservers läuft folgendermaßen ab:
- Der Server/"Manager" identifiziert einen Spielserver in der Datenbank, der erstellt werden soll. (Es wird davon ausgegangen, dass die Datenbankkommunikation bereits geordnet ist).
- Der Manager gabelt ein Kind (den "Spielleiter") auf.
- Der Gamecontroller richtet zwei Pipe-Paare ein, gabelt sich dann und ersetzt die stdin des Childs durch eine Pipe und die stdout und stderr durch eine andere Pipe.
- Das Kind des Spielcontrollers führt dann
execlp()
um die eigentliche ausführbare Datei des Spieleservers zu starten.
Meine Erfahrung mit Steckdosen ist relativ gering. Ich habe verwendet select()
auf einer Server-Anwendung, bevor sie zahlreiche Clients "multiplexen" kann, wie das einfache Beispiel in der GNU C-Dokumentation zeigt ici .
Jetzt habe ich eine neue Herausforderung, denn das System muss mehr können: Der Manager muss in der Lage sein, willkürlich Befehle an die Kinder der Spielsteuerung zu senden (die er durch regelmäßiges Überprüfen der Datenbank findet) und Antworten zu erhalten, aber auch von ihnen eingehende beliebige Befehle/Fehler erwarten und Antworten zurücksenden.
Ich brauche also eine Art "Kontext"-System, bei dem die Sockets nur für sich selbst von Bedeutung sind. Mit anderen Worten, wenn ein Befehl vom Manager an den Spielcontroller gesendet wird, muss jede Partei wissen, wer fragt und was die Antwort ist (und daher, welcher Befehl es eine Antwort ist).
Denn select()
ist nur nützlich, um zu wissen, wenn wir eingehende Daten haben, und ein Thread sollte auf sie blockieren, würde ich einen anderen Thread benötigen, die Daten sendet und die Antworten erhält? Erfordert dies, dass jeder Gamecontroller, obwohl er technisch gesehen ein "Client" ist, einen abhörenden Socket verwendet und mit select()
auch?
Ich hoffe, ich habe das System und das Problem kurz und bündig erklärt; ich werde bei Bedarf weitere Einzelheiten hinzufügen. Danke!