okay: starte mal den server von
Wie erstelle ich eine einfache nicht-blockende Server-Anwendung?
und lass nebenbei folgendes script laufen!
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
use strict;
use warnings;
$|++;
use IO::Socket::INET;
use IO::Select;
use threads;
use constant EXTERNADDR => '127.0.0.1';
use constant EXTERNPORT => 2005;
use constant INTERNADDR => '127.0.0.1';
use constant INTERNPORT => 4711;
sub thread_proc {
my $externsocket = IO::Socket::INET->new(
PeerAddr => EXTERNADDR,
PeerPort => EXTERNPORT,
Type => SOCK_STREAM,
Proto => "tcp"
) or die "Could not connect to external server : $@\n";
$externsocket->autoflush(1);
my $internsocket = IO::Socket::INET->new(
PeerAddr => INTERNADDR,
PeerPort => INTERNPORT,
Type => SOCK_STREAM,
Proto => "tcp"
) or die "Could not connect to internal server : $@\n";
$internsocket->autoflush(1);
my $select = IO::Select->new;
$select->add($externsocket);
$select->add($internsocket);
print "Wait for readable socket\n";
while(my @handles = $select->can_read) {
foreach my $handle (@handles) {
my $line = $handle->getline;
if(defined $line) {
$line =~ s!\r?\n$!!g;
if($handle == $internsocket) { # dad talks to us
$externsocket->print("$line\n"); # send everything to the external server
} elsif($handle == $externsocket) { # response from the server
print "Server Reply: [$line]\n";
}
} else { # socket closed from
$select->remove($handle);
$handle->close;
}
}
}
return (1);
}
my $internserver = IO::Socket::INET->new(
LocalAddr => INTERNADDR,
LocalPort => INTERNPORT,
type => SOCK_STREAM,
Reuse => 1,
Listen => 10
) or die "Could not create TCP server socket : $@\n";
$internserver->autoflush(1);
my $t = threads->create(\&thread_proc);
if(my $socket = $internserver->accept) { # wait for the thread
print "Thread connected\n";
for my $i (0 .. 9) {
$socket->print("Message #$i\n");
sleep(1);
}
$socket->print("quit\n");
$socket->close;
$internserver->close;
}
$t->join; # wait for thread to finish
HTH\n\n
<!--EDIT|esskar|1113002477-->