perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 31
Click for quality!




08.02.2012 / 22:55

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragAntwort vom Server bearbeiten
Seitenanfang
Hallo,

ich möchte mit einem Skript auf eine Anfrage ("s") am Game-Server, die Antwort auswerten (Player, Score ...).

Die Antwort kommt auch, nur wird danach die Verbindung nicht abgebrochen,sodass das Skript nicht weiter arbeiten kann.

Was kann man da machen?

Gruß,William


#!/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);
.

Datum: 22.08.2007-16:39

Beitragre: Antwort vom Server bearbeiten
Seitenanfang
oh...ich hatte da mal was ähnliches?!

schaun dich mal zu den spezifikationen von http-headern um, es gibt da ne option, mit der man sagen kann ob nach einer abgeschlossenen übertragung die verbindung weiter aufrecht erhalten werden soll, oder geschlossen.

mfg

Datum: 23.08.2007-13:15

Beitragre: Antwort vom Server bearbeiten
Seitenanfang
sry, für den doppelpost. ich hab da was gefunden:

http://www.bolege.de/http-header/#art1 schreibt:

connection: In HTTP/1.0 waren alle Verbindungen nicht persistent, d.h., der Server hat die Verbindung zum Client (ggf. nach der Lieferung des Dokuments) abgebrochen. Wollte ein Client eine persistente Verbindung aufbauen, so verwendete er den connection-Header mit der Angabe keep-alive. In HTTP/1.1 verhält es sich umgekehrt: Verbindungen sind immer persistent, es sei denn, der Client sendet den connection-Header mit der Angabe close. Werte:
* keep-alive: Der HTTP/1.0 Client wünscht eine persistente Verbindung.
* close: Der HTTP/1.1 Client kündigt das Ende der persistenten Verbindung an.

Datum: 23.08.2007-13:20

Beitragre: Antwort vom Server bearbeiten
Seitenanfang
Dank Dir, das wird es wohl sein. Ein einfacher http: request (mit Header) beendet die Verbindung auch korrekt.

Ich dachte noch an den socket Typ, aber das wirds wohl nicht sein.

Type Socket-Typ SOCK_STREAM | SOCK_DGRAM | ...

Gruß, William

Datum: 23.08.2007-14:00

Beitragre: Antwort vom Server bearbeiten
Seitenanfang
Also mit dem Header klappt das nicht. Es hängt wohl mit der Buffergröße zusammen.

So wie ich das beim Auslesen gemacht habe ist das sowie so Mist. Er liest bis zum Newline (eine Zeile) in bin-Daten!

<code>
while (<$socket>) {
print };
</code>

Sind jetzt keine Newlines vorhanden, geht es nicht weiter. Ist eins vorhanden, bricht er ggf. Mitten in den Daten ab.

Jetzt habe ich es anders probiert.
Ist der Buffer im Beispiel kleiner als die übertragenen Daten, werden die "wenigen" Werte zurückgegeben. Ist Wert größer geht es nicht weiter.

<code>
# $connection, $page, Buffergröße

read($connection, $page, 100);
</code>

Man müsste halt die exakte Puffergröße ermitteln oder dynamisch oder es irgendwie anders hinbekommen ...

Ich bin für jeden Tipp dankbar.

Gruß, William

<code>
#!/usr/bin/perl

use IO::Socket::INET;

$remote_host = "85.14.217.233";
$remote_port = "49124";

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

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

$connection->autoflush(1);

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

# $connection, $page, Buffergröße

read($connection, $page, 100);

print $page;
</code>

Datum: 23.08.2007-17:30

Beitragre: Antwort vom Server bearbeiten
Seitenanfang
Hallo!

Was meinst du mit "geht nicht weiter"? Gibt er $page noch aus, oder hängt er sich auf?

Bei ersterem: du kannst read genau wie den <>-Operator in einer Schleife anwenden:


my $page;
while(read $connection, my $buffer, 100) {
$page .= $buffer;
}

Grüße, Skrilax

Datum: 23.08.2007-19:08

Beitragre: Antwort vom Server bearbeiten
Seitenanfang
>Was meinst du mit "geht nicht weiter"? Gibt er $page > noch aus, oder hängt er sich auf?

Er sitzt halt im Programm fest, zum print kommt der gar nicht. Ich denke der wartet bis der Buffer voll ist o.ä.

while(read $connection, my $buffer, 100) ändert da leider auch nichts dran. Trotzdem danke.

Ich sende doch nur eine UDP Anfrage an den Server, der gibt mir eine Antwort zurück - mal kürzer mal länger. Die Antwort in eine Variable oder Array und fertig. In C ist das gar kein Problem, aber ich möchte das gerne in Perl haben, da der Rest in Perl so gut wie fertig ist (Daten filtern, zuordnen, DB-Anbindung, Statistikauswertung).

Gruß, zagadka

 
// Gamestat (Open Source) www.int64.org
//http://www.int64.org/docs/gamestat-protocols/ase.html

//ase.c
// ...
GS_SERVERINFO *queryserver_ase(const char *host, unsigned short port) {
SOCKET s=getsockudp(host, port);
size_t packetlen;
ASE_PACKET *packet;
GS_SERVERINFO *info;
GS_PROPERTY *curproperty=NULL;
GS_PLAYERINFO *curplayer=NULL;
char *iter, *end;
clock_t ping;
int i;

if(s==INVALID_SOCKET) return NULL;

ping=clock();
if(send(s, "s", 1, 0)==SOCKET_ERROR) {
lasterror=GS_ERROR_TIMEOUT;
closesocket(s);
return NULL;
}
packet=(ASE_PACKET*)getpacket(s, &packetlen);
if(!packet) {
lasterror=GS_ERROR_TIMEOUT;
closesocket(s);
return NULL;
}
ping=clock()-ping;
closesocket(s);

dbg_dumpbuf("ase.bin", packet, packetlen);

if(memcmp(packet->check, "EYE1", 4)) {
lasterror=GS_ERROR_CORRUPT;
free(packet);
return NULL;
}

info=calloc(1, sizeof(GS_SERVERINFO));
info->ping=(int)ping;

iter=packet->data;
end=((char*)packet)+packetlen;

if(iter>=end) goto err;
ase_skipstring(&iter); // skip game code

// ...


Datum: 23.08.2007-20:41

Beitragre: Antwort vom Server bearbeiten
Seitenanfang
Die Lösung findet sich im Perl Cookbook: Setting up a UPD Client: http://www.unix.org.ua/orelly/perl/cookbook/ch17_06.htm

Gruß, William

Datum: 26.08.2007-19:10

-






-
-