Mini Server der mehrer Verbindungen erlaubt

08/09/2008 - 19:12 von Axel Schmidt | Report spam
Hallo NG,

vorweg ich habe kaum Kenntnisse in Perl. Kenne mich aber in anderen
Programmiersprachen aus(PHP, C#, Basic).

Vor gut 3 Jahren stand ich vor dem Problem mit das ich einen Gameserver via
PHP starten wollte. Auf dem Root wo der Gameserver làuft sollte kein AMP
laufen. Da auf dem Linux Root eh schon Perl vorhanden war kam ich auf die
Idee einen Miniserver zu schreiben den ich über eine TCP Verbindung
ansprechen kann und der mir dann die Gameserver startet.

Ich habe mir folgendes Perl Script mithilfe des Internets erstellt was
bislang auch hervorragend funktioniert ->
http://axel-schmidt24.de/temp/ng/fi...server.txt

Nun stehe ich vor einer neuen Herrausforderung. Mein Team schreit nach
einem Windowsprogramm zum steuern der Gameserver. Das Programm in C# zu
erstellen machte mir keine Mühe. Jetzt fragst du dich was ich mit C# hier
in Perl möchte? Ich habe leider nun das Problem das mein Perl Script
erstens nur eine Verbindung zulàßt (was bislang nicht kritisch war weil eh
nur ein PHP script drauf zu griff) und zweitens wenn der Client (C#
Programm) die Verbindung unerwartet abbricht (Absturz, Internettrennung
usw.) dann beendet sich das Perl Script und es muss neu gestartet werden.
Bislang behelfe ich mir hier indem ich das Perl Script in einer Schleife
starte. Ich möchte aber gerne ein neues Miniserver Script erstellen welches
mehrer Verbindungen zulàßt und sich dadurch auch nicht beenden kann.

Soweisogut. Ich habe natürlich schon gesucht und auch ein Programmbeispiel
gefunden was macht was ich möchte ->
http://axel-schmidt24.de/temp/ng/fi...er_neu.txt
Allerdings weis ich nicht wie und wo ich meine Funktionen einbauen kann
weil ich das Programm bislang nicht verstehe.

Viele Grüße

A. Schmidt
 

Lesen sie die antworten

#1 Peter J. Holzer
14/09/2008 - 19:44 | Warnen spam
On 2008-09-08 17:12, Axel Schmidt wrote:
vorweg ich habe kaum Kenntnisse in Perl. Kenne mich aber in anderen
Programmiersprachen aus(PHP, C#, Basic).

Vor gut 3 Jahren stand ich vor dem Problem mit das ich einen Gameserver via
PHP starten wollte. Auf dem Root wo der Gameserver làuft sollte kein AMP
laufen. Da auf dem Linux Root eh schon Perl vorhanden war kam ich auf die
Idee einen Miniserver zu schreiben den ich über eine TCP Verbindung
ansprechen kann und der mir dann die Gameserver startet.

Ich habe mir folgendes Perl Script mithilfe des Internets erstellt was
bislang auch hervorragend funktioniert ->
http://axel-schmidt24.de/temp/ng/fi...server.txt


[...]
Ich möchte aber gerne ein neues Miniserver Script erstellen welches
mehrer Verbindungen zulàßt und sich dadurch auch nicht beenden kann.

Soweisogut. Ich habe natürlich schon gesucht und auch ein Programmbeispiel
gefunden was macht was ich möchte ->
http://axel-schmidt24.de/temp/ng/fi...er_neu.txt
Allerdings weis ich nicht wie und wo ich meine Funktionen einbauen kann
weil ich das Programm bislang nicht verstehe.



Im Prinzip gehört Dein Code hinter

# else I'm the child -- go spawn

eingefügt (und an das andere API angepasst). Allerdings würde ich eher
Dein Script modifizieren als das andere.

Ersetze einfach

auth_client(\$client); # schauen ob der denn darf
handle_client(\$client); # scheint jemand zu sein der den namen und das PW hat

close($client);

durch

my $pid = fork();
if (!defined $pid) {
print "fork failed: $!žn";
} elsif ($pid == 0) {
# I bin das Kind und muss hackeln:
auth_client(\$client); # schauen ob der denn darf
handle_client(\$client); # scheint jemand zu sein der den namen und das PW hat
exit(0); # wichtig - das Kind muss nach getaner Arbeit sterben
} else {
# Ich bin der Vater und brauche bis zur nàchsten Anfrage nichts
# weiter zu tun.
}


und füge vor der Schleife noch ein

$SIG{CHLD} = 'IGNORE';

ein.

Fertig.

Noch ein paar stilistische Anmerkungen:

Wozu übergibst Du Referenzen auf $client an auth_client und
hande_client? Soweit ich sehe, dereferenzierst Du das jedes Mal, ist
also unnötig. Wenn Du stattdessen auth_client($client); aufrufst, kannst
Du in auth_client $client->send statt $$client->send etc. schreiben.

Der Zeilentrenner unter Linux ist "", nicht "". Logfiles, in denen
jede Zeile außer der ersten mit ^M beginnt, sind vermutlich eher mühsam
zu lesen.
In "NET-ASCII" (telnet, SMTP, FTP, und viele andere Internet-Protokolle)
ist der Zeilentrenner "", nicht "". Wenn Du vorgefertigte Module
verwenden willst, um Kommandos an Deinen Server zu schicken (z.B.
Net::Cmd), sollten zumindest die Zeilenenden gleich sein. (Eigentlich
wundert mich schon, dass telnet funktioniert).
Und auch in Windows ist der Zeilentrenner "", aber das ist wohl hier
irrelevant.

»while ($login eq "false")« schaut für mich grauenhaft aus. Wenn Du hier
einen logischen Wert testen willst, dann schreib »while (!$login)« (und
initialisiere $login entweder gar nicht oder mit einem logisch falschen
Wert). Oder mach eine Endlosschleife daraus und ersetze das
»$login = "true";« durch ein »last;« oder »return;«.

Allerdings sollte ein Client vermutlich nicht unendlich lang eine
Verbindung aufrechterhalten können, ohne sich zu authentifizieren. Ein
»alarm(60);« an Beginn von auth_client und ein »alarm(0);« gibt dem
Benutzer eine Minute Zeit.

Dass der Benutzer nur nach Passwort gefragt wird, wenn er den/einen
gültigen Loginnamen erraten hat, gilt auch eher als unfein.

hp

Ähnliche fragen