PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Perlscript, Serverantwort auswerten



zagadka
21-08-2007, 21:35
Hallo!
Ich versuche gerade ein Perl-Skript zu schreiben, das eine Netzwerkverbindung zu einem Game-Server öffnet, ein Zeichen sendet ("s"), und Teile der Antwort (Player, Map, etc.) in entsprechende Variablen ablegt.

Eine Verbindung und Antwort kommt schon zustande, die Ausgabe erfolgt in der Shell.



#!/usr/bin/perl

use IO::Socket;

$remote_host = "81.0.231.147";
$remote_port = "49124";

$socket = IO::Socket::INET->new(PeerAddr => $remote_host,
PeerPort => $remote_port,
Proto => "udp",
Timeout => 5)
or die "Verbindungsaufbau fehlgeschlagen\n";

$socket->autoflush(1);

print $socket "s";

while (<$socket>) {
print };

close($socket);



EYE1farcry49001>$2>$1>$4> $61. $0{$8FC$1CZ$0} $1P$4ublic $1S$4erver $3AssaulAssault
mp_px_dune
gr_TimeLimit 1.4.0.140501516gr_ScoreLimit0 usw.



Zum einen beendet sich das Skript so nicht und zum anderen hätte ich die Antwort ganz gerne in einer Variablen, nur kommt folgendermaßen keine Antwort.



#!/usr/bin/perl

use IO::Socket::INET;

$remote_host = "81.0.231.147";
$remote_port = "49124";

$connection = new IO::Socket::INET (Proto=>"udp",
PeerAddr=>$remote_host,
PeerPort=>$remote_port);

print "Verbindungsaufbau fehlgeschlagen\n" if (!$connection);

$connection->autoflush(1);

send($connection, "s", 0 );

read($connection, $page, 1024*1024);

print $page;


Ich bin für jeden Tip dankbar.

Im nächsten Schritt stellt sich die Frage, wie man byte-weise lesen und bearbeiten kann. Das ASE-Protokoll fängt mit eye1 dann folgt ein byte, dass die Länge des folgenden Strings+ das byte angibt. Weiter gehts mit dem nächsten Byte+String usw. http://www.int64.org/docs/gamestat-protocols/ase.html

Gruß, zagadka

zagadka
21-08-2007, 22:15
Wenn man das erste Skript so abändert hat man Daten in der Variablen, allerdings fehlt ein Großteil am Ende.



#!/usr/bin/perl

use IO::Socket;

$remote_host = "81.0.231.147";
$remote_port = "49124";

$socket = IO::Socket::INET->new(PeerAddr => $remote_host,
PeerPort => $remote_port,
Proto => "udp",
Timeout => 5)
or die "Verbindungsaufbau fehlgeschlagen\n";

$socket->autoflush(1);

print $socket "s";

$answer = <$socket>;

print $answer;

close($socket);


Gruß, zagadka

zagadka
26-08-2007, 19:25
Im Perlcookbook gibts die Antwort: Setting up a UDP Client: http://www.unix.org.ua/orelly/perl/cookbook/ch17_06.htm

Gruß