PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [perl] asynchrone client/server-Kommunikation



ThorstenHirsch
12-07-2006, 15:57
Servus!

Ich habe entsprechend dieser Anleitung (http://perl-tutor.de/perl_net.htmlhttp://perl-tutor.de/perl_net.html) einen Client und einen Server gebastelt, die sich unterhalten können. Damit aber was sinnvolles passieren kann, möchte ich entweder

a) dass der Parent-Prozess über das socket vom Child mit dem Client reden kann (hab ich ausprobiert und $session übergeben, aber da kommt nix beim Cient an - ich kann scheinbar nur vom Child aus die $session benutzen

oder

b) die Sache irgendwie ohne fork() lösen ...da seh ich aber ein Problem darin, dass "$session = $socket->accept;" meinen Server blockieren würde bis ich mich mit einem Client anmelde - das will ich natürlich nicht, denn der Server soll weiterlaufen auch ohne dass ein Client angemeldet ist.

Muss ich threaden? Geht damit überhaupt das was ich will? Oder habt ihr vielleicht nen viel besseren Vorschlag?

Gruß
Thorsten

ThorstenHirsch
14-07-2006, 13:36
Hab' das mal mit Threads probiert, will aber nicht so richtig klappen. Folgendes Problem: ich kann weder das Socket ($socket=IO::Socket::INET->new(...)) noch die Session ($session=$socket->accept()) zwischen den beiden Threads sharen, weil Perl das sharen von globs nicht unterstützt.

Jetzt hab' ich aber gelesen, dass Sockets auch nur Filehandles sind und ich $fhsocket=fileno($socket), bzw. $fhsession=fileno($session) dazu benutzen kann, die socket/session über den filehandle-Umweg doch sharen zu können - ich muss sie bloß im anderen Thread wieder mit open() öffnen. Also sind jetzt $fhsession und $fhsocket mit share() geshared worden und ich öffne sie im anderen Thread mit open(my $session,"+> $fhsession") und open(my $socket, "+> $fhsocket"). Soweit die Theorie. In der Praxis funktioniert das leider überhaupt nicht, da kommt mit einem print $session 'hallo' weder vom client zum server noch umgedreht irgendetwas an. Dass die Verbindung ohne den ganzen shared-Kram funktioniert, hab' ich zuvor getestet, das klappte prima ...ich konnte halt bloß nur in dem Thread die Session benutzen, der sie aufgemacht hat. Tja...und so bringt mir das leider nix. :(