fsockopen und udp

boyker

Grünschnabel
hi all,

Ich habe folgendes Problem:
Auf einem rechner hier, habe ich ein Freelancer Server aufgesetz, leider ist der rechner aber nicht immer an, daher wollte ich eine Statusseite coden, die den onlinestatus ausgiebt. dazu habe ich hier ja schon einiges gefunden und bin auf fsockopen() gekommen.
mit internetseiten klappt das ja super.
Aber mit dem UDP Status leider nicht, denn die Site sagt immer das der Server "Online" ist.

hier mein script:
PHP:
$adressx = "192.168.1.10";

$portx = "2302";

$fpx = fsockopen("udp://".$adressx, $portx, &$errno, &$errstr,2);

if(!$fpx)

{

echo "server is down";

}

else

{
echo "Online";

}

Die ports sind 2302-2304

Wie gesagt, er zeigt mir immer an, das der Server online ist. auch wenn er nicht gestartet ist.
Sollte ich hier etwas überlesen haben, bitte ich noch mals um entschuldigung.
Kann mir jemand nen tipp geben oder hat jemand für freelancer schon was fertiges?

Gruß
Boyker
 
Noch ein Problem...

ich kann dir leider nicht weiterhelfen, :(

habe aber ebenfalls ein Problem mit der Abfrage eines Gameservers per udp und fsockopen. Ich möchte auf einer LAN den Status eines Severs mit fester IP im Intranet anzeigen. Solange der rechner auf dem der Server läuft an ist gibt es kein Problem, jedoch wird die maximale Ausführungszeit von PHP überschritten wenn der Rechner nicht an ist. (es dauert mehr als 30 sek und ich möchte nicht,dass jemand so mehr als 10 sek warten muss.

Ich würde mich sehr freuen wenn mir jemand einen tipp oder gar ein script nennen könnte um dieses Problem zu lösen.

Mfg, Martin.
 
ich möchte nicht,dass jemand so mehr als 10 sek warten muss.

PHP:
$fpx = fsockopen("udp://".$adressx, $portx, &$errno, &$errstr,2);

du siehst am ende die 2? das ist der "Timeout" setze ihn auf 10 dann wird nur 10 sekunden versucht auf den server zuzugreifen. da bei mir der server im gleichen netz läuft, genügt hier ein timeout von 2. (denke ich)
wenn du die Fehlermeldungen ebenfalls deaktivieren willst, dann seze ein "@" vor fsockopen.

hoffe dir geholfen zu haben.

gruß Boyker
 
Hi

PHP:
$addr = '80.143.350.999';
$port = 80;

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_UDP);

// hier evtl sockte auf nonblock setzen.... testen!
//socket_set_nonblock($socket);

if(socket_connect($socket,$addr,$port))
{
    echo('da');
}else{
    echo('nich da');
}
socket_close($socket);

Ich hab das hier jetzt mal ungetestet reingetippselt...
Da kann also noch ein bischen drann gefeilt werden

Um dieses beispiel nutzen zu können muss PHP mit --enable-sockets compiled sein...
 
Zuletzt bearbeitet:
Original geschrieben von u-Danilo

Ich hab das hier jetzt mal ungetestet reingetippselt...
Da kann also noch ein bischen drann gefeilt werden

Um dieses beispiel nutzen zu können muss PHP mit --enable-sockets compiled sein...

Also erstmal vielen Dank, anscheinend ist php bei mir nicht mit --enable-sockets installiert wurden. da ich den Fehler "Call to undefined function: socket_create() " bekomme.
ach so, funst das auch unter winxp?
kann ich das in der php.ini nachträglich eintragen?
wenn ja unter welchem punkt?

und vorallem, was macht dieses Script genau? *am kopfkratzt*

Gruß
Boyker
 
Erstmal Danke für den Tipp :)

Das ärgerliche ist nur das ich den Timeout bereits per Voreinstellung auf 1s gesetzt habe und dann später im Script sogar noch auf 0.5s eingestellt habe und trotzdem braucht das Teil noch satte 15s bis die Seite angezeigt wird.

Habs übrigens mit dem Script von Boyker probiert und es dauert leider genau so lange wie vorher und es wird immer 'da' ausgegeben obwohl die IP nichtmal existiert.

Mfg Martin.
 
Errata...

PHP:
$addr = '80.143.350.999'; 
$port = 80; 

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_UDP); 

// hier evtl sockte auf nonblock setzen.... testen! 
//socket_set_nonblock($socket); 

if(socket_connect($socket,$addr,$port)) 
{ 
    if(socket_getpeername($socket,&$r_host,&$r_port))
    {
        echo('da');
    }else{
        echo('nich da');
    }
}else{ 
    echo('nich da'); 
} 
socket_close($socket);

Ja, das sollte auch auf winxp funzen wenn man in der php.ini das Semikolon (;)
vor der sockets.dll bzw. sockets.so weg macht...

Zur Funktionsweise:

Das script erstellt mittels socket_create() einen socketresource in $socket
mittels socket_connect() wird mit remote verbunden und socket_getpeername checkt ob am andern Ende vom peer was ist... Also bei mir funktioniert das hier :-)

[OT]
Warum ist denn "f u n z t" hier ein badword ?
[/OT]
 
Zuletzt bearbeitet:
Juhuuuuuu, Problem gelöst ^^

Das Problem ist gelöst :)

Ich habe nochmal gegoogelt und bin zufällig auf eine Lösung gestoßen.

Es funktioniert bei mir wenn ich die Zeile
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_UDP);
in
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
ändere und
if(@socket_connect($socket,$addr,$port))
schreibe.

Vielen Dank trotzdem für die Hilfe und das Script. ;)
 
Zurück