Filehandles und Sockets

28/03/2008 - 13:22 von Kevin Osthoff | Report spam
Hi!

Ich hab hier ein kleines Problem, an dem ich schon ein paar Stunden
rumprobiere. Und zwar will ich einen kleinen Server schreiben, der
mehrere Verbindungen entgegen nimmt und diese in einem Hash verwaltet.
Hier der Code:


for ( ; ; ) {
vec( $rin, fileno(SHELL), 1 ) = 1;
if ( ( $nready = select( $rin, undef, undef, undef, ) ) < 0 ) {
die "select: $!";
}

if ( vec( $rin, fileno(REVSHELL), 1 ) == 1 ) {
$addr = accept( CONN,REVSHELL ) or die "accept $!";
$connection{$addr} =*CONN;

}
}



Das Problem besteht jetzt darin, dass die erste Verbindung geschlossen
wird, wenn eine zweite Verbindung zustande kommt. Müsste, so wie ich es
verstanden hab, daran liegen, dass ich nur ein Alias abspeichere. Also
hab ich mir eine Funktion gebastelt, die das Filehandle dupliziert.


sub dup {
my $socket = shift;
local *DUP;
open(*DUP,"+<&=$socket");
return *DUP;
}



Aufrufen tu ich das so:


$connection{$addr} = dup(*CONN);



Funktioniert aber leider auch nicht. Die Verbindungen brechen zwar nicht
ab, aber ich kann nichts senden.
Wie macht man es richtig?

Danke im vorraus!
 

Lesen sie die antworten

#1 Thomas Kratz
28/03/2008 - 15:28 | Warnen spam
Kevin Osthoff wrote:

Ich hab hier ein kleines Problem, an dem ich schon ein paar Stunden
rumprobiere. Und zwar will ich einen kleinen Server schreiben, der
mehrere Verbindungen entgegen nimmt und diese in einem Hash verwaltet.



Schau Dir besser mal IO::Socket und IO::Select an. Das kurze Beispiel in
der IO::Select Doku ist schon fast alles was Du brauchst.

Thomas

$/=$,,$_=<DATA>,s,(.*),$1,see;__END__
s,^(.*\043),,mg,@_=map{[split'']}split;{#>J~.>_an~>>e~..>r~
$_=$_[$%][$"];y,<~>^,-++-,?{$/=--$|?'"':#..u.t.^.o.P.r.>ha~.e..
'%',s,(.),\$$/$1=1,,$;=$_}:/\w/?{y,_, ,,#..>s^~ht<._..._..c
print}:y,.,,||last,,,,,,$_=$;;eval,redo}#.>.e.r^.>l^..>k^.-

Ähnliche fragen