Naja, die Frage ist, was Du unter "direkt" verstehst. Dein Perlskript kann nicht ohne weiteres die
Verbindung von einem Client zum anderen weiterreichen. Es kann aber den
Datenverkehr zwischen zwei Verbindungen hin- und herkopieren.
Letzteres geht in groben Zügen so (ungetestet):
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
64
65
66
67
68
69
70
71
72
use IO::Handle;
use IO::Select;
use constant {
BLOCKSIZE => 8192
};
my $c0 = ...;
my $c1 = ...;
$c0->blocking(0);
$c1->blocking(0);
my $rcvsel = IO::Select->new($c0, $c1);
my %rcvbuf = ($c0 => '', $c1 => '');
my %sndtgt = ($c0 => $c1, $c1 => $c0);
my $sndsel = IO::Select->new();
my %sndbuf = ($c0 => $rcvbuf{$c1}, $c1 => $rcvbuf{$c0});
while ($rcvsel->count > 0 or $sndsel->count > 0) {
my @ready = $rcvsel->can_read();
for (@ready) {
my $buf = \$rcvbuf{$_};
my $len = $_->sysread($$buf, BLOCKSIZE, length($$buf));
if (defined $len) {
if ($len > 0) {
$sndsel->add($sndtgt{$_});
}
else {
$rcvsel->remove($_);
}
}
else {
die "read error: $!";
}
}
@ready = $sndsel->can_write();
for (@ready) {
my $buf = \$sndbuf{$_};
my $len = $_->syswrite($$buf);
if (defined $len) {
substr($$buf, 0, $len) = '';
if (length($$buf) <= 0) {
$sndsel->remove($_);
}
}
else {
die "write error: $!";
}
}
}
$c0->close();
$c1->close();
When C++ is your hammer, every problem looks like your thumb.