AND51 hat geschrieben:Das klingt ja furchtbar einfach! Für jede eingehende Verbindung wird also ein neuer Socket erstellt. Doch wie sähe das in PB aus? Hier muss ich ja mit einer ClientID arbeiten. Für jede Verbindung gibt es in PB ja eine ClientID, richtig? Kann man also sagen "ClientID = Socket"?
Vielleicht, das macht PB ja intern. So auf die Schnelle sieht es so
aus, als gäbe es in PB nicht die Möglichkeit, den Connected-Socket
selbst zu verwalten. Man muss bei jedem Event nachfragen, welcher
Client es denn ausgelöst hat. Mit Connected-Sockets erhältst du nur
die Events von dem einen Client.
AND51 hat geschrieben:Um performante Anwendungen wie Apache zu schreiben, müsste also ein Master-Prozess jeden Socket einzeln an verschiedene vorher gestartete Child-Prozesse vergeben. Das macht man dann also via File-Descriptors. Ist das etwa der Dateiname zu einer *.sock-Datei oder wie muss ich mir das vorstellen? Ich habe bisher nur ein oder zwei *.sock-Dateien gesehen (von fail2ban und Dovecot). Daher weiß ich darüber noch nicht so viel.
Also eine Variante ist direkt nach einem "Client-Connected"-Event
den FileDescriptor (FD) dieses Connected-Sockets an einen Child-
Prozess weiterzugeben. FDs sind Handles, man kann also mehrere
FDs auf die gleiche Datei zeigen lassen. Wobei so ein Socket
nicht unbedingt an eine Datei im Dateisystem gebunden sein muss,
es ist normalerweise ein sogenannter "unnamed Socket". Also optional
kann man den Socket auch über das Dateisystem verfügbar machen,
dann siehst du solche .sock Dateien. Ansonsten sind Sockets einfach
"Streams", die über die FD angesprochen werden können.
An einen bestehenden (Child-)Prozess kannst du die FDs wie hier
beschrieben übergeben:
http://www.cs.nyu.edu/bacon/phd-thesis/diss/node21.html
Weshalb es einfacher ist, direkt nach Erhalt eines FDs zu forken,
dann nämlich erbt der Child-Prozess die FDs ohne, dass man sie
senden muss.
AND51 hat geschrieben:Forken kann man den eigenen Prozess mit PB aber nicht — oder etwa doch?

In Perl wüsste ich ja, wie das geht, aber in PB... Trotzdem, zum besseren Verständnis frage ich hier auch nochmal: Angenommen, in PB gäbe es den fork()-Befehl, dann müsste ich immer forken, wenn ich ein #PB_Network_EventClient-Ereignis erhalte, richtig? Wennich das richtig verstehe, hat dann der Kind-Prozess die ClientID des gerade neu verbundenen Client, während der Vater-Prozess einfach wieder bei NetworkEvent() wartet, bis eine Verbindung reinkommt.
Code: Alles auswählen
fork_() ; sollte klappen, aber Achtung, der Debugger mag das IIRC nicht so
Das wäre prinzipiell richtig, aber wie ich feststellen musste, erlaubt
es PB soweit ich sehe nicht, die Client-Sockets selbst in die Hand
zu nehmen. Man muss leider selbst per ClientID feststellen, welcher
Child-Prozess diese Daten verarbeiten soll. Dann muss der Hauptprozess
selbst die Daten empfangen und zur Verarbeitung weitergeben. Das
ist ziemlich schlecht...
Ich würde daher vorschlagen, du schaust dir ein paar Socket-Beispiele
an und machst dir einen eigenen kleinen Network-Wrapper, der dann
das Forken möglich macht.
greetz
remi