|
|
 |

|

 |

| Community » Perl: Allgemeines Forum |
|
Antwort 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

|
re: 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

|
re: 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

|
re: 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

|
re: 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

|
re: 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

|
re: 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

|
re: 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

|
|

|

|

|
 |

|

|
|