Thread Port redirect/weiterleitung
(3 answers)
Opened by monti at 2012-09-18 14:05
Soweit ich es sehe willst du was wie ein Chat machen. Dafür brauchst du aber keine Zwei Ports. Das geht alles über einen (ungetestet):
Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 #!/usr/bin/perl use strict; use warnings; use IO::Socket; use IO::Pipe; $SIG{CHLD}='IGNORE'; my $pipe = IO::Pipe->new(); die("Can't cerate Pipe") unless($pipe); my $sock = IO::Socket::INET->new( LocalHost => 'localhost', LocalPort => '7070', Proto => 'tcp', Listen => 1, Reuse => 1, ); die "Could not create socket: $!\n" unless $sock; my $srun; while($srun = $sock->accept()) { my $pid1=fork(); my $pid2; if(defined($pid1)) { unless($pid1) { $pipe->reader(); run($pipe,$srun); } $pid2=fork() if($pid1); if(defined($pid2)) { $pipe->writer(); run($srun,$pipe); } else { kill(15,$pid1) if($pid1); } } $srun->close; } sub run { my ($sin,$sout)=@_; close(STDIN); close(STDOUT); close(STDERR); $sout->autoflush(1); $sin->blocking(0); my $buffer,$size; while($sin->opened() and $sout->opened()) { $sout->syswrite($buf,$size) while($size=$sin->sysread($buffer,1024)); select(undef,undef,undef, .05); } $sin->close(); $sout->close(); exit(); } Bei jedem neuen Client der sich verbindet werden zwei Prozesse erzeugt, eines das die Daten vom Client in die Pipe Schreibt und eines, das die Daten aus der Pipe an den Client schreibt. Das funktioniert weitgehend so wie bei murphy, nur das ich kein "IO::Select" nutze sondern nur teste ob die Handles noch offen sind alle Daten darin transferiere und dann ein wenig warte. Eleganter ist das natürlich über "IO::Select" Diese einfache Umsetzung erzeugt ein "Echo" für jeden Client. Wenn du das unterdrücken willst musst du jedem Datenpaket zusätzliche Informationen beigeben von welchem Client sie kommen, und diese Informationen beim Schreiben auswerten. |