PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Perl und xinet.d



elrond
17-01-2006, 12:08
Hallo,

ich bin gerade dabei ein prog zu schreiben, das für mich ein paar daten ausliest. Ich möchte dieses über das netzwerk also via tcp erreichen. Einen eigenen serverprozess dafür zu schreiben halte ich für übertrieben...

Deshalb will ich das script mittels xinetd starten, wenn eine anfrage kommt. Hat das schon mal jemand von euch gemacht? ich kenn mich mit dem ding leider nicht so aus....

Mir schwebt dabei folgendes vor:


service myscript
{
socket_type = stream
wait = no
user = elrond
server = /home/elrond/myscript.pl
}


selbst wenn das läuft, wie bekomme ich im script die Anfragedaten? via STDIN? :confused:

ich hoffe Ihr könnt helfen

Joghurt
17-01-2006, 16:12
selbst wenn das läuft, wie bekomme ich im script die Anfragedaten? via STDIN?Ja. Und STDOUT wird an den Socket weitergeleitet

elrond
18-01-2006, 06:46
hast du da vllt. ein beispiel?

Ich habe aus der doku rausgelesen, dass der xinetd nur die vermittlung übernimmt und sich dann in die kommunikation nicht einmischt.

Wenn ich mit stdin / stdout erbeite, bedeutet das, dass xinted den socket selbst "betreut"... :confused:

Vielleicht ist's ja auch ne frage der config...

Joghurt
18-01-2006, 15:45
Also ich habe nur inetd hier. Kann mir aber nicht vorstellen, dass xinetd das völlig anders macht. Vielleicht hast du nur $|=1; vergessen?

Egal:
inetd.conf:
6666 stream tcp nowait root /tmp/a.plStatt root natürlich was anderes nehmen
/tmp/a.pl
#!/usr/bin/perl
$|=1;
while(<>) { print lc; }

HTH

Jetzt kann ich telnet localhost 6666 eingeben und bekomme Großbuchstaben in Kleinbuchstaben umgewandelt.

PS: Nicht vergessen, xinetd zu sagen, dass er die Config neu laden soll. Alternativ xinetd neu starten.

elrond
19-01-2006, 06:45
das klingt nach nem wichtigem hinweis...

leider bin ich nicht mit allen perl-feinheiten vertraut; was ist das "$|=1;"

[EDIT]
so, jetzt rennt's danke! :D

so sieht das Teil aus, dass die anfrage entgegennimmt:


$|=1;
my $msg="";
my $end=0;

while(<>) {
$msg.= $_;
last if ($msg=~ /\<\/root\>/ ); #beenden der Schleife sobald </root> gesendet wurde
}


if(!( $xmldata = XMLin($msg))) { print "fehler\n"; }
else {
$reqdata{ 'head' } = $xmldata->{'head'};
$reqdata{ 'data' } = $xmldata->{'data'};
if ($reqdata{ 'head' }{'kommart'} eq 'REQ') { print workreq(\%reqdata); }
}


eigentlich ganz einfach... :o

Joghurt
19-01-2006, 16:00
$|=1 schaltet das Puffern von stdout aus.

PS: Nach XML ist auch </root > zulässig.

Teste besser auf </root *>

elrond
21-01-2006, 07:06
wie du sieht mache ich genau das. Danke nochmal! :)