Schrift
[thread]6027[/thread]

Signal Handler: Signal Handler

Leser: 1


<< >> 8 Einträge, 1 Seite
ahnungsloser
 2004-01-21 10:33
#79337 #79337
User since
2003-09-03
80 Artikel
BenutzerIn
[default_avatar]
Hi,

ich bins wieder mal, der absolut Ahnungslose. Ich hab da so ein Problem, habe ein Grundgerüst, für einen Telnet Server gebastelt. nun kommt es vor, dass der aufrufende Client, einfach das Fenster via STRG+x© beendet, bzw. das Fenster mit dem Obligatorischen (X) Fensterschliesser schliesst und mein Serverchen bleibt hängen und akzeptiert keine anbindungen mehr. Daher suche ich eine möglichkeit, diese Signale zu unterdrücken, bzw. zu ignorieren, hier mal der code schnibbel:

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
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
use Socket;
use Carp;
$| = 1;

my $port = 23;
my $proto = getprotobyname('tcp');
my $lf = "\x0a";
my $cr = "\x0d";

sub logmsg { print STDOUT "$0 $$: @_ um ", scalar localtime, "\n" }

socket(Server, PF_INET, SOCK_STREAM, $proto) or die "socket: $!";
setsockopt(Server, SOL_SOCKET, SO_REUSEADDR, pack("l", 1)) or die "options: $!";

bind(Server, sockaddr_in($port, INADDR_ANY)) or die "bind: $!";
listen(Server, SOMAXCONN) or die "liste $1";

logmsg "Server an Port $port gestartet";

my $paddr;

$SIG{CHLD} = \&REAPER;

while ($paddr = accept(Client, Server)) {

my($port, $iaddr) = sockaddr_in($paddr);
my $name = gethostbyaddr($iaddr, AF_INET);
my $cc;

logmsg "Verbindung von $name [", inet_ntoa($iaddr), "] an Port $port";



select Client;
$| = 1;
print "password: ";
read Client, $cc, 3;
close Client unless $cc eq 'abg';

while ( $cc ne 'x' ) {
&menu;
read Client, $cc, 1;

if ( $cc eq '1' ) { &funktion1; read Client, $anykey, 1; }
if ( $cc eq '2' ) { &funktion2; read Client, $anykey, 1; }
if ( $cc eq '3' ) { &funktion3 }
if ( $cc eq 'x' ) { &funktionx; read Client, $anykey, 1; }

}



}

sub menu {
print "\n" x 50;
print "\rWillkommen zu Appels Server-checker!\n\r";
print "--------------------------------------\n\r";
print "\n" x 8;
print "\rFunktion waehlen:";
print "\t[1] Server Connectivty der ABG Frankfurt Holding\n\n\r";
print "\t\t\t[2] angemeldeten Benutzer zeigen\n\n\r";
print "\t\t\t[3] verbundene Netzlaufwerke zeigen\n\n\r";
print "\t\t\t[x] Programm beenden\r";
print "\n" x 8;
}

sub funktion1 {
open HOSTS, "listeserver.txt";

@hostlist = <HOSTS>;


foreach $host ( @hostlist ) {

@ping = `ping -l 1 -n 1 $host`;

if ($ping[3] =~ /Antwort/) {
chomp ($host);
print Client "$host Server ist erreichbar!\n\r";
}

else {
 chomp ($host);
 print Client "$host Server konnte nicht erreicht werden!\a\n\r";


}
close HOSTS;
}
}

sub funktion2 {
print Client "das ist funktion2";

}

sub funktion3 {

}

sub funktionx {
print Client "\n\r";
print Client "\t";
print Client "#" x 16;
print Client "\n\r";
print Client "\tBye, Bye Baby!!!\n\r";
print Client "\n\r";
print Client "\t";
print Client "#" x 16;
close Client;
exit;
}


Das ganze soll auf Windows 2000 laufen und ich benutze die ActiveState Distro.

Bearbeitet von Crian: code-Tags ergänzt\n\n

<!--EDIT|Crian|1074680093-->
Crian
 2004-01-21 12:13
#79338 #79338
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Ich empfehle Dir mal

1) perldoc perlstyle ... insbesondere zum Thema Einrückungen

2) code-Tags (mach ich für dieses Posting gerade mal, aber in Zukunft nach Möglichkeit selbst einbauen...)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
ahnungsloser
 2004-01-21 12:26
#79339 #79339
User since
2003-09-03
80 Artikel
BenutzerIn
[default_avatar]
Hi,

1. Perlstyle, ja das lässt so einiges zu wünschen übrig, hatte den code gerade ausgeschnitten und eingefügt, und nich sehr viel auf Formatierungen geachtet! Versuche mich zu bessern

2. Was ist das???
kabel
 2004-01-21 12:45
#79340 #79340
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
hier ein strace-auszug:

Quote
write(4, "\rWillkommen zu Appels Server-che"..., 39) = -1 EPIPE (Broken pipe)
--- SIGPIPE (Broken pipe) @ 0 (0) ---
sigreturn()


du frägst die reads nicht ab!
=> du bekommst nicht mit, ob dein gegenüber die verbindung geschlossen hat
=> du machst ein write auf einen geschlossenen socket
=> der kernel schickt dir ein SIGPIPE <und> du frägst SIGPIPE nicht ab
=> standardverhalten bei empfang eines SIGPIPE ist termination (siehe man 7 signal)

jedes read (hint, hint!) muss auf EOF abgefragt werden!
write () hat übrigens auch seine tücken ...

HTH
-- stefan
Strat
 2004-01-21 13:15
#79341 #79341
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
code-tags: da packst du code einfach zwischen [ code ] und [ /code ] (ohne die leerzeichen), und dann sieht er nicht mehr aus wie
#! /usr/bin/perl
use CGI;
my $cgi = CGI->new();
if ($cgi->param('irgendas') {
print $cgi->header();
}

sondern:
Code: (dl )
1
2
3
4
5
6
#! /usr/bin/perl
use CGI;
my $cgi = CGI->new();
if ($cgi->param('irgendas') {
print $cgi->header();
}


siehe auch Forum Code
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
ahnungsloser
 2004-01-21 16:29
#79342 #79342
User since
2003-09-03
80 Artikel
BenutzerIn
[default_avatar]
@strat: Ok, nu hab ich das gerafft mit dem Code Tag, werd mich demnächst dranhalten. Als Ahnungsloser-Hesse, werde ich mich um die Korrektheit mühen.

@kabel: So ganz hab ich das noch nicht verstanden, werd das gute stück noch mals überarbeiten und mit den themen beschäftigen, auch wenn ich da noch absolut im dunklen fische!

Gruß,
P.s. Vielen Dank dass meine Nachlässigkeiten verziehen und mir geholfen wird!
Crian
 2004-01-21 21:14
#79343 #79343
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Das war auf keinen Fall negativ gemeint. Es soll Dir nur helfen (einmal für das eigene Verständnis und einmal dafür, dass sich mehr Leute mit Deinen Beiträgen beschäftigen) :)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
ahnungsloser
 2004-01-22 19:29
#79344 #79344
User since
2003-09-03
80 Artikel
BenutzerIn
[default_avatar]
Hallo,

also, ich bin immer dankbar etwas dazu zu lernen, da ich wirklich noch ganz am anfang stehe. Deswegen, rügt mich ruhig, sobald ich das Board hier verunstalte oder mich nicht korrekt ausdrücke!

THX
<< >> 8 Einträge, 1 Seite



View all threads created 2004-01-21 10:33.