• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

fsockopen 2x funktioniert nicht

Tom99

New member
Hallo ich hab vollgendes Problem ich will mit einem Script Abfragen an einen Gameserver schicken bei ersten fosckopen funktioniert das auch alles prima nur bei 2 mal hauts agrnicht mehr hin.
PHP:
<?php
$ip = "localhost";
$port = 28960;
$rcon_pw = "test123";


$connect = fsockopen("udp://$ip", $port);
fwrite($connect,"ÿÿÿÿrcon $rcon_pw serverinfo"); 
socket_set_timeout($connect, 1);
$ausgabe = fread($connect,1000);
$ausgabe = trim($ausgabe);
$zeilen = explode("\n", $ausgabe);
foreach($zeilen as $key){
if(eregi('mapname.*', $key)){
$map = trim(eregi_replace('mapname.(.*)', "\\1", $key));
}
if(eregi('g_gametype.*', $key)){
$gametype = trim(eregi_replace('g_gametype.(.*)', "\\1", $key));
}
if(eregi('sv_maxclients.*', $key)){
$maxplayer = trim(eregi_replace('sv_maxclients.(.*)', "\\1", $key));
}
}
fclose($connect);
unset($connect);

$connect = fsockopen("udp://$ip", $port);
fwrite($connect,"ÿÿÿÿrcon $rcon_pw serverinfo"); 
socket_set_timeout($connect, 1);
$ausgabe = fread($connect,1000);
$ausgabe = trim($ausgabe);
$zeilen = explode("\n", $ausgabe);
var_dump($zeilen);

fclose($connect);


switch($gametype){
case "dm":
$gametype = "Free For All";
break;
case "war":
$gametype = "Team Death Match";
break;
case "sd":
$gametype = "Suchen und Zerstören";
break;
case "koth":
$gametype = "Hauptqautier";
break;
case "dom":
$gametype = "Herrschaft";
break;
case "sab":
$gametype = "Sabotage";
break;
}
echo "IP: ".$ip.":".$port."<br>";
echo "Map: ".$map."<br>";
echo "Gametype: ".$gametype."<br>";
echo "Spieler: ".$player."/".$maxplayer;
?>
Danke schonmal Tom
 
Ups naja beim der zweiten Abrfrage kommt einfach ein leeren String raus.
Edit:
Bin mir nichmal sicher ob Überhaupt etwas abgesendet wird.
 
Zuletzt bearbeitet:
Ups naja beim der zweiten Abrfrage kommt einfach ein leeren String raus.
Wenn Du jetzt noch sagst, dass Du _alles_ probiert hast, dann wäre das auch nicht viel hilfreicher.

Edit:
Bin mir nichmal sicher ob Überhaupt etwas abgesendet wird.
aha

Was genau hast Du alles probiert?
Wie stellst Du sicher, dass die Verbindung überhaupt zustande kommt?
Warum fängst Du keine Fehlercodes ab?
Hast Du die Kommunikation mal gesnifft (aka Wireshark)?
Was sagt die LogDatei des Servers?
 
Also wennn das Erste funktioniert müsste ja eigentlich auch das zweite mal klappen. Fehlercodes werden doch so oder so ausgageben nur halt nicht bei dem Fall. Wireshark warum leigen beide auf dem selben Server.
 
Also wennn das Erste funktioniert müsste ja eigentlich auch das zweite mal klappen. Fehlercodes werden doch so oder so ausgageben nur halt nicht bei dem Fall. Wireshark warum leigen beide auf dem selben Server.
Wenn Du Deine Annahmen durch Ausprobieren und Testen wiederlegt und weitere Erkenntnisse erlangt hast, dann kannst Du Dich ja nochmal melden.
 
Ok hab follgendes Probiert hab: Ich habe den 2. fsockopen Teil in eine neu Datei geschrieben und ausgeführt und siehe da alles funktioniert Problem los.
Also muss es am Code davor liegen, an was ist mir aber immer noch Schleicherhaft.
 
Ok hab follgendes Probiert hab: Ich habe den 2. fsockopen Teil in eine neu Datei geschrieben und ausgeführt und siehe da alles funktioniert Problem los.
Also muss es am Code davor liegen, an was ist mir aber immer noch Schleicherhaft.
Ok damit hätten wir sichergestellt, dass Du die erste Frage gelesen, teilweise verstanden und versucht hast sie zu beantworten. Willst Du jetzt vielleicht mal eine von den vier anderen probieren? Oder nimmst Du weiterhin an, dass keine davon relevant ist?
 
Ja, da ich mittlerweile alles ausser snifen probiert habe.
Und in den Logs des Gameservers herausgefunden habe das der erste Befehl ausgeführt wird der zweite aber nicht.
 
Tut Deine Nase eigentlich langsam weh?

Ja, da ich mittlerweile alles ausser snifen probiert habe.
Und in den Logs des Gameservers herausgefunden habe das der erste Befehl ausgeführt wird der zweite aber nicht.
Tja, Du hast also alles ausprobiert, d.h. die zweite Verbindung kommt definitiv zustande, keines der Kommandos gibt nachweislich einen Fehlercode zurück, nur die doofe Nachricht kommt einfach nicht beim Server an. Da fällt mir ein, zu diesem "alles" hab ich da nicht schonmal einen Kommentar zu abgegeben?
Niemand zwingt Dich hier mitzuarbeiten, ich bin mir sicher Du findest die Lösung früher oder später auch selbst heraus.
 
Die ebenso unterhaltsame wie wenig hilfreiche Lektüre dieses Threads hat mich leider nicht weitergebracht, denn ich habe ein sehr ähnliches Problem wie der Threadersteller.

Es wird versucht 2 mal hintereinander eine Socketverbindung herzustellen. Die 1. wird korrekt bearbeitet, die 2. hingegen nicht.

Folgendermaßen sieht der Code hierzu aus.
PHP:
error_reporting(E_ALL);
$host = "google.de";
$file = "/foo.php";
$header = http_request_head($host, $file);

if($header[0][1]=='404') echo 'not found<br>';
if($header[0][1]=='301') 
{
	$loc = str_replace('http://', '', $header[1][1]);
	$pos = strpos($loc, '/');
	if( $pos===false )$file = '/';
	else $file = substr( $loc, $pos);
	$host = str_replace($file, '', $loc);
	$header = http_request_head( $host, $file);

	if($header[0][1]=='404') echo 'not found<br>';		
}

function http_request_head( $host, $file){
	$fp = fsockopen($host, 80, $errno, $errstr, 30);
	if (!$fp){
		trigger_error( "$errstr ($errno)<br />\n");
		return;
	}		
    $out = "HEAD " . $file . " HTTP/1.1\r\n";
    $out .= "Host: " . $host . "\r\n";
    $out .= "Connection: Close\r\n";
    $out .="\r\n";
    
    fwrite($fp, $out);
    $lines = array();
    
    while (!feof($fp)) {
       	$data = fgets($fp, 128);
        $lines[] = explode(' ', $data); 
    }
    fclose($fp);
    return $lines;
}

Die HTTP Anfrage wird beide Male korrekt abgesetzt. Ausgehend von obigem Code lauten sie jeweils konkret (ohne die \r\n):

1. HEAD /foo.php HTTP/1.1 Host: google.de Connection: Close
2. HEAD /foo.php HTTP/1.1 Host: Google Connection: Close

Die while-Schleife wird bei der 2. Anfrage genau 1 mal betreten. danach liefert feof true zurück. fgets liefert keine Daten.

In einem ähnlichen Szenario habe ich diesen Code mit einem Server getestet, auf den ich Zugriff habe, dort klappte auch die 2. Anfrage. Dieses Szenario unterscheidet sich von dem obigen in der Hinsicht, dass im ersten Falle kein 301 - Permanently Moved empfangen wurde.
 
Vielleicht ist das ja hilfereich:
Die HTTP Anfrage wird beide Male korrekt abgesetzt. Ausgehend von obigem Code lauten sie jeweils konkret (ohne die \r\n):

1. HEAD /foo.php HTTP/1.1 Host: google.de Connection: Close
2. HEAD /foo.php HTTP/1.1 Host: Google Connection: Close
Deine Aussage, dass die Anfrage beide Male korrekt abgesetzt wird, ist falsch. Sie wird nur einmal korrekt abgesetzt. Beim zweiten Mal eben nicht. Ich empfehle var_dump, alternativ: Wireshark.
 
Die Variable $loc sollte noch getrimmt werden:

PHP:
...
$loc = str_replace('http://', '', $header[1][1]);
$loc = trim($loc);
...
 
Wireshark sagt folgendes (ich habe mal nur die relevanten Teile gepostet):

Code:
4	0.053482	192.168.1.107	216.239.59.104	HTTP	HEAD /foo.php HTTP/1.1 

13	0.149974	192.168.1.107	209.85.129.104	HTTP	HEAD /foo.php Continuation or non-HTTP traffic

15	0.440149	192.168.1.107	209.85.129.104	HTTP	[TCP Retransmission] HEAD /foo.php Continuation or non-HTTP traffic

"Continuation or non-HTTP traffic" bedeutet nach ein bißchen googlen wohl soviel, dass bei der 2. Anfrage TCP-Packet keinen HTTP header enthält. Was normalerweise nicht schlimm ist, da eine HTTP Anfrage schon mal auf mehrere TCP-packets aufgeteilt wird.

In diesem Falle, handelt es sich aber um eine neue Anfrage, deswegen müßte da schon ein Header mitgeschickt werden. Nun hab ich aber keinen Schimmer warum das nicht der Fall sein sollte. Ich rufe doch die selbe Funktion auf?

Außerdem vermisse ich irgendwie den HTTP Response für die erste Anfrage. Den bekomme ich nämlich:
Code:
HTTP/1.1 301 Moved Permanently
Location: http://www.google.de/foo.php
Content-Type: text/html; charset=UTF-8
Date: Wed, 30 Jul 2008 09:37:08 GMT
Expires: Fri, 29 Aug 2008 09:37:08 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 225
Connection: Close
 
Entschuldige, ich hab einfach den Sinn deines Vorschlags beim ersten Mal nicht begriffen.

Vielen herzlichen Dank, das wars. Manchmal sind die Fehler einfach zu dämlich :) .
 
Zurück
Oben