Schrift
[thread]11572[/thread]

IO::Socket::INET - Client stirbt ohne Fehler

Leser: 3


<< >> 2 Einträge, 1 Seite
bloonix
 2008-04-03 19:32
#107827 #107827
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hallo Community,

mein Anliegen ist recht simple. Ich habe einen Client, der sich zum Server connected
und ein paar Daten abliefert. Angenommen, der Server stirbt oder beendet die
Verbindung. Wenn der Client dann versucht etwas zum Server zu senden, dann
stirbt der Client ohne eine einzige Fehlermeldung. Ich habe nichtmal die Chance
den Fehler mit eval{} abzufangen!

Hier zwei Testskripte:

server.pl
Code: (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
use strict;
use warnings;
use IO::Socket::INET;

my $socket = IO::Socket::INET->new(
LocalHost => '127.0.0.1',
LocalPort => 43618,
Type => SOCK_STREAM,
Listen => 10,
Reuse => 1,
) or die "server: can't open socket over port 43618";

warn "server initialized\n";

while ( 1 ) {

while (my $client = $socket->accept) {
my $request = <$client>;
chomp($request);
next unless $request;
warn "client pid: $request\n";

# close() um zu testen wie der Client darauf reagiert
close($client);
}

}

close($socket);


client.pl
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
use strict;
use warnings;
use IO::Socket::INET;

my $socket = IO::Socket::INET->new(
PeerAddr => '127.0.0.1',
PeerPort => 43618,
Proto => 'tcp',
Type => SOCK_STREAM,
) or die "client: can't connect to 127.0.0.1:43618";

warn "client connected to server\n";

while ( 1 ) {
warn "send pid to server\n";
eval { print $socket "$$\n" };
last if $@;
sleep 1;
}

warn "lost connection\n";
close($socket);


Code: (dl )
1
2
3
#> perl server.pl 
server initialized
client pid: 2270


Code: (dl )
1
2
3
4
5
#> perl client.pl 
client connected to server
send pid to server
send pid to server
send pid to server


Hier würde ich nun ein "Lost connection" erwarten, aber es kommt
einfach nichts. Lustig ist auch, dass client.pl erst beim 3. print() stirbt.

Hat jemand eine Ahnung, was da schief läuft?

Gruss,
bloonix
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.
bloonix
 2008-04-03 19:37
#107828 #107828
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Die Lösung:

Code: (dl )
$SIG{PIPE}='IGNORE';


Thanks to betterworld@irc.perl.org#perlde!
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.
<< >> 2 Einträge, 1 Seite



View all threads created 2008-04-03 19:32.