| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

09-02-2009, 17:41
|
|
h3R0in
Newbie
|
|
Registriert seit: Feb 2009
Beiträge: 7
|
|
Gameserver mit udp und socket abfragen, Problem
Hi,
ich habe hier ein kleines Problem wenn ich mit fsockopen die Statistiken von einem Gameserver (Crysis Wars)
abfragen will. Die Verbindung herzustellen, klappt, auch etwas hin zu schicken:
PHP-Code:
$socket = fsockopen("udp://*ip*", 64100, $ernno, $ersstr, 2);
fwrite($socket, $data);
*ip* wird durch die serverip ersetzt
um zu wissen was ich als Daten hinschicken muss habe ich mal mit Wireshark mitgesnifft was das Game selber schickt,
und als Antwort kommen natürlich die Serverdaten.
sind leider alles HEX-Werte, aus denen ich nichts lesen kann, abgesehen von der Antwort die kommen müsste.
PHP-Code:
$data ="\xfe\xfd\x00\x4b\x4f\x06\x00\xdb\x7e\x89\x2b\x12\x01\x06\x05\x08\x0a";
$data .="\x03\x13\x04\x32\x33\x34\x35\x37\x36\x38\x39\x3a\x3b\x00\x00";
Wenn ich dann aber die Daten, die der Server mir ja zurücksenden müsste, mit
PHP-Code:
echo fread($socket, 128);
oder
PHP-Code:
echo fgets($socket, 128);
abfragen will, passiert einfach nichtsmehr.
Der Browser (Firefox) sagt mir dann Minutenlang "warte...", aber es kommt nichts.
Habe ich etwas falsch gemacht was eine UPD-Verbindung angeht?
Oder ist es eher wahrscheinlich das ich falsche Daten hinsende mit denen der Server nichts anzufangen weiß und einfach nichts zurückschickt?
Danke Jungs (und vielleicht auch Mädls:-))
|

09-02-2009, 18:59
|
|
PHP-Desaster
PHP Expert
|
|
Registriert seit: Mar 2006
Beiträge: 3.104
|
|
Habe länger nichts mit Sockets gemacht, aber UDP kommt nicht über die gleiche Verbindung zurück. Du musst einen eigenen Socket erstellen, dich an einen Port binden und auf die Serverantwort horchen. Das liegt einfach daran, das UDP im Gegensatz zu TCP nicht Verbindungsorientiert arbeitet.
|

09-02-2009, 22:20
|
|
Laire
Registrierter Benutzer
|
|
Registriert seit: May 2004
Beiträge: 741
|
|
Also ich habe bisher nur mit Servern auf Rcon Basis gearbeitet, dort bekomme ich mit folgendem Script eine Statusmeldung zurück:
PHP-Code:
$ip = "12.34.567.89";
$port = 28960;
$challenge = "\xFF\xFF\xFF\xFF\x02getstatus\x0a\x00";
$fp = @fsockopen("udp://$ip", $port, $errno, $errstr, 1);
stream_set_timeout($fp, 1, 0);
stream_set_blocking($fp, true); // SET TIMEOUT FOR OFFLINE SERVERS
fwrite($fp, $challenge);
$buffer = fread($fp, 4096 * 10);
fclose($fp);
|

09-02-2009, 22:51
|
|
h3R0in
Newbie
|
|
Registriert seit: Feb 2009
Beiträge: 7
|
|
Ich habe bis jetzt eine TCP Verbindung zum Rconnect hergestellt, mit Authentifizierung und der Möglichkeit, Commands zu Rconnect zu schicken.
Das war kein großes Problem. Mir geht es im genauen darum, die Serverstatistiken abzufragen, Kills, Deaths und ähnliches.
Und soweit ich bis jetzt weiß geht das nicht mit einem Consolenbefehl ("status" gibt mir nur Daten die ich nicht verwenden kann).
Darum versuche ich jetzt die UDP-Verbindung (Problem: Verbindungslos) "nachzuahmen" und die Statistiken abzufragen,
die man bekommen kann, wenn man in der Serverliste den Server anklickt.
Also, eigendlich genau das selbe wie Laire es hat, nur bekomme ich dann entweder keine Verbindung zum Server (Adresse könne nicht aufgelöst werden),
oder es kommt keine Antwort, wie es mir bisher meistens passiert ist.
Laire:
Ich habe grade nur den Gaming-Port zur Hand.
Das ist wahrscheinlich der Fehler. Ich werde mal schauen ob der Admin mir den Rcon-Port verrät
PHP-Desaster:
Bis jetzt funktioniert das "an einen Port binden und horchen" noch nicht so ganz, aber heute hab ich auch keine Lust mehr daran weiter zu probieren.
Mit etwas Glück ist aber genau das die Antwort die mir fehlte um das Script endlich zum laufen zu bewegen.
|

10-02-2009, 00:43
|
|
Laire
Registrierter Benutzer
|
|
Registriert seit: May 2004
Beiträge: 741
|
|
In meinem Beispiel ist es auch der Gaming Port, also über den Port wo ich bei COD4 auf den server Connecte... Das komplezierte war das xFFxFFxFFxFFx02getstatusx0ax00 herraus zu finden... und das habe ich auch noch geklaut ;-)
Das war ja der Befehl, den ich bei der Verbindung sende um den Status zurück zu bekommen....
|

10-02-2009, 08:05
|
|
h3R0in
Newbie
|
|
Registriert seit: Feb 2009
Beiträge: 7
|
|
Achso, du bist bei COD4 :-). Ich versuchs ja mit Crysis Wars. Und ich wunder mich wieso jetzt auch nichts passiert...
Ich werd heute Nachmittag mal schauen ob ich irgendwas besseres mit Wireshark aus dem Netzwerk abfangen kann.
Ansonsten habe ich keine Idee mehr wie ich das ganze weiter angehen soll.
|

10-02-2009, 14:21
|
|
UzumakiNaruto
Registrierter Benutzer
|
|
Registriert seit: Nov 2004
Ort: Hannover
Beiträge: 584
|
|
ich könnte dir ein funktionierendes script für soldier of fortune II schicken (rcon)
hier hast du eine demo:
http://anime-naruto.dyndns.org/gameserver/
vielleicht kannst siehst du ja etwas wenn du die daten von deinem GS einträgst
__________________
Gruß
Uzu
|

10-02-2009, 23:15
|
|
h3R0in
Newbie
|
|
Registriert seit: Feb 2009
Beiträge: 7
|
|
@UzumakiNaruto:
Wenn ich in der Demo IP und Port eingebe bekomm ich als fehler:
- SoF2 server might be changing map (wait for the refresh if you have javascript enabled).
- SoF2 server might be lagged and this request timed out.
Was wahrscheinlich auf Deutsch heißt, dass das Script auch keine Antwort zurück bekommt.
Würde mich aber trotzdem freuen wenn du mir mal das Script schicken kannst. Vielleicht übersehe ich ja noch immer etwas, das du aber hast :-)
Wie entsteht folgender Fehler:
Warning: socket_create_listen() [function.socket-create-listen]: unable to bind to given adress [98]: Address already in use in /mounted-storage/.. ./test.php on line 20
wenn das aber der erste Befehl im Script ist?(Zeile 20 entsteht durch nen paar auskommentierte Zeilen)
|

10-02-2009, 23:24
|
|
PHP-Desaster
PHP Expert
|
|
Registriert seit: Mar 2006
Beiträge: 3.104
|
|
Naja, wenn du dich an einen Port binden willst, der schon belegt ist. Kann auch gerne mal passieren, wenn dein Skript mehrmals schnell nacheinander läuft und der Socket nicht richtig freigegeben wird. Dann dauerts etwas, bis das Betriebssystem den Port wieder freigibt. Alternativ läuft bereits etwas anderes auf dem Port.
|

10-02-2009, 23:33
|
|
Laire
Registrierter Benutzer
|
|
Registriert seit: May 2004
Beiträge: 741
|
|
kann da nicht der streamtimeout helfen?
|

25-02-2009, 00:09
|
|
h3R0in
Newbie
|
|
Registriert seit: Feb 2009
Beiträge: 7
|
|
so, nach langer zeit melde ich mich hier nochmal um die unklarheiten zu beseitigen.
Das problem lag nicht a, mir, oder am gameserver, sondern daran dass mein webspace-anbieter wohl kein udp-stream zulässt. denn bei mir zu hause auf nen schnell aufgesetzten apache bekomme ich sofort eine antwort.
aber damit treten jetzt die nächsten probleme auf.
wenn ich daten (immer die selben, festgelegten daten) zu server hinsende, bekomme ich eine zahl zurück die jedesmal variiert.
dann müsste ich wieder eine zahl hinschicken (natürlich ändert die sich auch, ohne irgendeinen sichtbaren bezug zur vorzahl) und darauf bekäme ich dann meine gewünschten daten.
das hab ich jetzt noch aus dem traffic-logs von wireshark.
aber da ich das nicht auf meinem webspace laufen lassen kann, werde ich das thema aufgeben.
|

25-02-2009, 09:45
|
|
ArSeN
Registrierter Benutzer
|
|
Registriert seit: Feb 2006
Ort: Berlin
Beiträge: 1.052
|
|
Zitat:
Original geschrieben von h3R0in
... ohne irgendeinen sichtbaren bezug zur vorzahl ...
|
Für dich ... vielleicht weiß ja hier jemand Rat?
Zitat:
|
aber da ich das nicht auf meinem webspace laufen lassen kann, werde ich das thema aufgeben.
|
Schade, klang echt interessant  (man könnte natürlich auch den Webspace wechseln)
__________________
Nur wenige wissen, wieviel man wissen muss, um zu wissen, wie wenig man weiß.
|

26-02-2009, 17:54
|
|
UzumakiNaruto
Registrierter Benutzer
|
|
Registriert seit: Nov 2004
Ort: Hannover
Beiträge: 584
|
|
also ich musste bei mir den support anschreiben das sie bitte den port X udp für die ip Y freigeben .. haben sie umgehend gemacht
__________________
Gruß
Uzu
|

26-03-2009, 10:50
|
|
niccolo20
Newbie
|
|
Registriert seit: Mar 2009
Beiträge: 1
|
|
Zitat:
Original geschrieben von Laire
Also ich habe bisher nur mit Servern auf Rcon Basis gearbeitet, dort bekomme ich mit folgendem Script eine Statusmeldung zurück:
PHP-Code:
$ip = "12.34.567.89";
$port = 28960;
$challenge = "\xFF\xFF\xFF\xFF\x02getstatus\x0a\x00";
$fp = @fsockopen("udp://$ip", $port, $errno, $errstr, 1);
stream_set_timeout($fp, 1, 0);
stream_set_blocking($fp, true); // SET TIMEOUT FOR OFFLINE SERVERS
fwrite($fp, $challenge);
$buffer = fread($fp, 4096 * 10);
fclose($fp);
|
Super, danke..
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|