Vielleicht kommt der Server einfach nicht mehr mit, denn er muss ja die
Requests auch verarbeiten und bis er den nächsten Request aus der
Schlange nehmen kann, vergeht ja Zeit. Vielleicht lässt sich das Problem
lösen, indem du den Server einfach mit fork vermehrst und somit die
Arbeit auf mehrere Server aufteilst. Alle Server lauschen dann auf den
gleichen Socket und nehmen Requests an. Server, die nichts mehr zu tun
haben, lauschen dann erneut auf das Socket. So bildet sich eine Queue
von Servern. Hier ein Client-Server-Beispiel:
server.pl
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
use strict;
use warnings;
use IO::Socket::INET;
$|++;
my $socket = IO::Socket::INET->new(
LocalHost => '127.0.0.1',
LocalPort => 50010,
Type => SOCK_STREAM,
Listen => 1000,
Reuse => 1,
) or die "server: can't open socket over port 50010";
warn "server $$ initialized\n";
for (0..4) {
my $pid = fork;
last unless $pid;
warn "server $pid forked\n";
}
while (my $client = $socket->accept()) {
my $pid = <$client>;
chomp($pid);
warn "Server $$ received request from: $pid\n";
close($client);
}
close($socket);
client.pl
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
use strict;
use warnings;
use IO::Socket::INET;
$|++;
warn "Client $$ initialized\n";
for (0..4) {
my $pid = fork;
last unless $pid;
warn "Client $pid forked\n";
}
sleep 3;
while ( 1 ) {
my $socket = IO::Socket::INET->new(
PeerAddr => '127.0.0.1',
PeerPort => 50010,
Proto => 'tcp',
Type => SOCK_STREAM,
) or die "client: can't connect to 127.0.0.1:50010";
warn "Client $$ connected to server\n";
print $socket "$$\n";
close($socket);
sleep 1;
}
Starte den Server:
server 6563 initialized
server 6564 forked
server 6565 forked
server 6566 forked
server 6567 forked
server 6568 forked
alle Server warten dann auf Requests.
Dann starte den Client:
Client 6574 initialized
Client 6577 forked
Client 6578 forked
Client 6579 forked
Client 6580 forked
Client 6581 forked
Client 6577 connected to server
Client 6578 connected to server
Client 6579 connected to server
Client 6580 connected to server
Client 6581 connected to server
Client 6574 connected to server
Client 6577 connected to server
Client 6578 connected to server
Client 6579 connected to server
Client 6580 connected to server
Client 6581 connected to server
Client 6574 connected to server
Client 6577 connected to server
Client 6578 connected to server
Client 6579 connected to server
Client 6580 connected to server
Client 6581 connected to server
Client 6574 connected to server
Client 6577 connected to server
Client 6578 connected to server
Client 6579 connected to server
Client 6580 connected to server
Client 6581 connected to server
Client 6574 connected to server
und die Server verarbeiten alle schön zusammen (nacheinander) die
Requests:
Server 6564 received request from: 6577
Server 6564 received request from: 6578
Server 6565 received request from: 6579
Server 6566 received request from: 6580
Server 6567 received request from: 6581
Server 6568 received request from: 6574
Server 6563 received request from: 6577
Server 6564 received request from: 6578
Server 6565 received request from: 6579
Server 6565 received request from: 6580
Server 6565 received request from: 6574
Server 6566 received request from: 6581
Server 6563 received request from: 6577
Server 6564 received request from: 6578
Server 6567 received request from: 6579
Server 6567 received request from: 6580
Server 6565 received request from: 6581
Server 6566 received request from: 6574
Server 6563 received request from: 6577
Server 6564 received request from: 6578
Server 6568 received request from: 6579
Server 6568 received request from: 6580
Server 6567 received request from: 6581
Server 6565 received request from: 6574\n\n
<!--EDIT|opi|1182248526-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.