PHP - Socket unread_bytes permanent 0

komaspieler

New Member
Hi
ich habe ein kleines, aber sehr störendes Problem: ich arbeite zur Zeit an einem Projekt, bei dem eine Socketverbindunge via fsockopen() zu einem Counter-Strike: Source Server von Nöten ist.

Schön und gut, die Verbindung baut sich ordnungsgemäß auf, keine Timeouts, alles super.
Nun sende ich den Befehl für die Ausgabe der Serverinformationen (s. Valve Developer Wiki & PHP Ausschnitt unten) an den Server - und erwarte eigentlich eine Rückmeldung vom Server.

Jedoch bleibt bei der Statusüberprüfung durch socket_get_status() der Wert unread_bytes stetig auf 0, es wurde also keine Antwort vom Server empfangen.

Soweit sogut, jeder Programmierer/Coder würde hier vermuten, dass ein Fehler im Script/Befehl vorliegt - habe ich auch erst getan und dieselbe Funktion auf einem anderen Server getestet - und siehe da: die Antwort vom Gameserver wird erhalten und ausgegeben.

Ich vermute also, dass bei meinem eigentlichen Server ein Konfigurationsfehler o.ä. vorliegt, weiss mir aber nicht zu helfen, da mir keine Konfigurationsmöglichkeiten in Richtung Sockets bei PHP bekannt sind.

Hier einige Daten zum (v)Server und Script:
Modell: vServer (OS: Debian)
Anbieter: server4you (ich denke mal, daran liegt es *hust*)
Hier die technischen Daten auf einfachstem Weg, den ich mir denken konnte (beancounters):
Code:
       uid  resource           held    maxheld    barrier      limit    failcnt
    XXXXXX: kmemsize        3210332    4949457    9384760   10323236          0
            lockedpages           0          0        430        430          0
            privvmpages       46161      72113     131448     144594          0
            shmpages            655       3375      23020      23020          0
            dummy                 0          0          0          0          0
            numproc              45         73        144        144          0
            physpages         15042      29773          0 2147483647          0
            vmguarpages           0          0      98304 2147483647          0
            oomguarpages      24522      38134      98304 2147483647          0
            numtcpsock           23         63        244        244          0
            numflock              3         22        336        369          0
            numpty                1          3         24         24          0
            numsiginfo            0         10        768        768          0
            tcpsndbuf         17824     276272    1884024    3681759          0
            tcprcvbuf             0     342080    1884024    3681759          0
            othersockbuf      14904     102180     844366    1481926          5
            dgramrcvbuf           0     248008     844366     844366          0
            numothersock         13         56        288        288          0
            dcachesize       475846     564816    1503190    1548286          0
            numfile            1094       1657       3360       3360          0
            dummy                 0          0          0          0          0
            dummy                 0          0          0          0          0
            dummy                 0          0          0          0          0
            numiptent            44         74         96         96          0

Auszug aus dem Script (auf das wesentliche reduziert):
PHP:
<?php
$stream = fsockopen("udp://".$row["ip"], $row["port"], $errno, $errstr);
$cmd = "\xFF\xFF\xFF\xFF\x54\x53\x6F\x75\x72\x63\x65\x20\x45\x6E\x67\x69\x6E\x65\x20\x51\x75\x65\x72\x79\x00";
fwrite($stream, $cmd, strlen($cmd));
$status = socket_get_status($stream);
print_r($status); # unread_bytes werden hier auf dem s4y vServer als ständig leer (= 0) angezeigt
?>

Ich habe bereits zum testen die Firewall deaktiviert und andere Gameserver-IPs benutzt, jedoch immer dasselbe Ergebnis auf dem vServer erhalten.

Die php.ini habe ich nun ebenfalls angehangen, falls es hilft (Sockets sind an.. mehr steht da ja ned wirklich drin).
Vielleicht habt ihr eine Idee, woran das liegen könnte.

Danke im Voraus
Thomas "komaspieler"
 

Attachments

Last edited by a moderator:
Update

Ich habe jetzt einmal die Kommunikation mit dem Server via tcpdump verfolgt (danke für den Tip elias ^^) und folgendes ist dabei herausgekommen:

Der Gameserver baut die Verbindung erfolgreich auf, erhält den Befehl seine Infos auszuspucken, spuckt sie aus und bekommt dann vom s4y vServer die Antwort "Destination Port unreachable" (XX.XX.XXX.XXX ist die IP des vServers, habe sie vorsorglich wegen aktuell deaktivierter Firewall "geschwärzt"):
Code:
No.     Time        Source                Destination           Protocol Info
      3 0.002887    XX.XX.XXX.XXX         62.75.160.29          ICMP     Destination unreachable (Port unreachable)

Frame 3 (152 bytes on wire, 96 bytes captured)
Linux cooked capture
Internet Protocol, Src: XX.XX.XXX.XXX (XX.XX.XXX.XXX), Dst: 62.75.160.29 (62.75.160.29)
Internet Control Message Protocol
    Type: 3 (Destination unreachable)
    Code: 3 (Port unreachable)
    Checksum: 0xd2bb
    Internet Protocol, Src: 62.75.160.29 (62.75.160.29), Dst: XX.XX.XXX.XXX (XX.XX.XXX.XXX)
    User Datagram Protocol, Src Port: 27015 (27015), Dst Port: 34665 (34665)
        Source port: 27015 (27015)
        Destination port: 34665 (34665)
        Length: 88
        Checksum: 0xbbcf
    Data (24 bytes)

0000  ff ff ff ff 49 07 54 6e 47 20 47 61 6d 69 6e 67   ....I.TnG Gaming
0010  77 69 65 73 65 00 64 65                           wiese.de


Zur nochmaligen Information: die Firewall (in Form eines Firewallscriptes/iptables) habe ich bereits zu Testzwecken deaktiviert und auf einem anderen Server läuft das Script tadellos!

Ich wäre wirklich froh, wenn jemand von euch da einen Rat wüsste.
 
Last edited by a moderator:
triplepost *evil* o_O

Das Problem hat sich gelöst, dank zahlreicher hilfreicher Hinweise im Chat ^^
Zum einen durfte ich heute morgen noch feststellen, dass Socketverbindungen, die über ein eingebundenes Klassenobjekt (Datei A => $obj = new class_name; // Datei B => include("class.php"); & $obj->arbeite_mit_sockets();) Probleme verursacht (auf jeder Maschine auf der ich es getestet habe o_O) und, dass man iptables lieber von Hand "spülen" sollte, bevor man meint, dass ein Script es ausgeschaltet hat ^^

Lag also doch an der Firewall.
Ich danke iT|Free, flyingoffice, elias5000 und allen anderen die freundlicherweise im Chat Hinweise und Tips gegeben haben und somit letztendlich zur "Lösung" des "Problems" beigetragen haben :)

Gruß
koma
 
Hallo komaspieler,

da fühlt man sich ja richtig geehrt.

Ich bedanke mich im Namen von #ssf mal herzlich bei dir und bin froh, dass du es lösen konntest.

Vielleicht möchtest du den Anderen noch sagen wie du das Klassen Problem gelöst hast, damit auch andere davon profitieren können.

Und man sieht es mal wieder:
Manche Probleme löst man besser 'on the fly', wenn man im Forum nicht weiter kommt...
ABER: Das Forum sollte natürlich die erste Anlaufstelle sein, da man somit auch Anderen hilft, die später mal das selbe Problem haben ;)

Lieben Gruß
Free

PS:
*nochmal Werbung mach*
>>hier<< könnt ihr uns erreichen ;)
 
Naja, das Klassenproblem war folgendes:

Am Anfang hatte ich folgende Dateistruktur:
PHP:
# datei_a.php

class tolleklasse {
  function Funktion ( $var ) {
    # kram mit sockets (s. oben for instance)
  }
}

$obj = new tolleklasse;

PHP:
# datei_b.php

require_once("datei_a.php");
$status = $obj->Funktion($var);

Mit diesem Aufbau hatte ich dann auch auf meinem Computer Probleme, das Script ans Laufen zu bekommen.

Also habe ich einfach das Klassenobjekt erst in datei_b.php definiert:

PHP:
# datei_b.php

require_once("datei_a.php");
$obj = new tolleklasse;
$status = $obj->Funktion($var);

Und das Problem mit der Klasse war gelöst (natürlich die definition $obj = new tolleklasse; in datei_a.php vorher entfernen ;)).
 
Back
Top