[PHP] fsockopen (TCP / UDP) (erledigt)

DadyCool

Well-known member
ID: 81813
L
30 April 2006
601
19
hi

wie funktioniert eigentlich fsockopen?

Wenn ich es richtig verstanden habe

per TCP
PHP:
fsockopen('111.222.333.444, 7000, $errno, $error, 5);

Es wird versucht zu dem Rechner 111.222.333.444 auf Port 7000 per TCP zu connecten. Die 5 gibt dabei den Timout an, wann die Verbindung fehlgeschlagen ist.

Ab wann steht die Verbindung zum Rechner? Also muß auf dem Rechner ein x Beliebieges Programm laufen das auf Port 7000 lauscht? Oder reicht es wenn der Port einfach nicht geblockt wird?


per UDP
PHP:
fsockopen('111.222.333.444, 7000, $errno, $error, 5);

Was ist wenn das Verbindungsanfragepackt verloren gegangen ist. Wird ein neues geschcikt?

DadyCool[/QUOTE]
 
Zuletzt bearbeitet:
Abgesehen vom fehlenden Anführungszeichen ist der Code für TCP soweit korrekt. Die Verbindung kommt nur zustande, wenn auf dem Zielrechner ein Programm auf dem angegebenen Port lauscht.

Für UDP musst du folgenden Code verwenden:
PHP:
fsockopen('udp://111.222.333.444', 7000, $errno, $error, 5);
Da es bei UDP afair keine Verbindungen gibt, kann auch kein Verbindungsanfrage-Paket verloren gehen.

Gruß,
MrToiz
 
erstmal danke...

Hintergrund:

Wir haben ein 2DSpiel. Die Server tragen sich in eine eine Internet Liste eine. Alle anderen Clients können so den Server finden und die IP rausbekommen und dann dem Spiel beitretten.

Im moment läuft das per TCP.... wäre aber UDP nicht sinvoller....?

Möchte eigentlich nur genau wissen wie es funktioniert.
Wann wird erkannt das der Port erreichbar ist?

DadyCool
 
Zuletzt bearbeitet:
Naja das kommt auf die Menge der Server an, bei wenigen Servern würde ich prinzipiell die ganze Liste auf einen Schlag per TCP übertragen, bei vielen Servern würde ich es wahrscheinlich eher per UDP machen, da es ja dann nicht schlimm ist wenn mal ein paar Server nicht angezeigt werden.

Bei TCP wird erkannt dass der Port erreichbar ist wenn der Client ein ACK-Paket erhält, bei UDP wird das gar nicht erkannt (zumindest nicht in OSI-Schicht 4).
 
Hat mich grad selbst gewundert, dass das so im Manual steht, habe den Code also gerade mal getestet. Obwohl bei mir UDP-Port 13 definitiv nicht offen ist, kommt keine Fehlermeldung.
Denke mal $fp ist nur FALSE, wenn der Host nicht gefunden werden kann.
 
MrToiz schrieb:
Hat mich grad selbst gewundert, dass das so im Manual steht, habe den Code also gerade mal getestet. Obwohl bei mir UDP-Port 13 definitiv nicht offen ist, kommt keine Fehlermeldung.

Keine Fehlermeldung bedeutet prinzipiell nicht, dass der Rückgabe-Wert true (nicht false) ist.
 
Johnson schrieb:
Keine Fehlermeldung bedeutet prinzipiell nicht, dass der Rückgabe-Wert true (nicht false) ist.

hmmm muß ich auch mal testen.

Aber irgendwie bin ich noch nicht schlauer geworden :oops:

Ich habe den Text mal editiert, ich denke er ist so verständlicher ;)

Wie funktioniert fsockopen mit UDP. ? Ich dachte eigentlich dass man mit UDP keine Verbindung aufbauen kann, da es ein verbindungsloses Netzprotokoll ist.

Aber laut https://de.php.net/fsockopen kommt wohl doch eine Verbindung zustande. Mich würde jetzt interessieren wie diese Verbindung funktioniert.

Mein Ziel ist es für unser 2D Spiel zu checken ob ein UDP Port offen ist. Mit fsockopen und TCP ist dies ja ohne Probleme möglich. Geht dieses aber auch mit UDP?

DadyCool
 
Zuletzt bearbeitet:
Also wie ich das sehe ( ich mag mich aber gerade irren ) hast du nur 2 Moeglichkeiten ...

1) Du musst ( wirklich nur auf UDP bezogen ) provoziern, dass der Server dir antwortet. Sonst wird das nix weil, wie gesagt, UDP ist verbindungslos.

oder aber 2) Du pingts den Server einfach an, weil die IP hast du ja ... gibt dir allerdings keine Information darueber, was grad auf dem Server los ist ...
 
buggle schrieb:
Also wie ich das sehe ( ich mag mich aber gerade irren ) hast du nur 2 Moeglichkeiten ...

1) Du musst ( wirklich nur auf UDP bezogen ) provoziern, dass der Server dir antwortet. Sonst wird das nix weil, wie gesagt, UDP ist verbindungslos.

oder aber 2) Du pingts den Server einfach an, weil die IP hast du ja ... gibt dir allerdings keine Information darueber, was grad auf dem Server los ist ...

THX

DadyCool
 
Wie muß ich es machen wenn ich an den client ein 1 Byte großes Paket mit dem Inhalt 250 schicken möchte?

DadyCool
 
Einfach die Dateifunktionen benutzen, auch wenn es ein Socket is ;)
PHP:
fwrite($socket_handle,"\xFA");
 
theHacker schrieb:
Einfach die Dateifunktionen benutzen, auch wenn es ein Socket is ;)
PHP:
fwrite($socket_handle,"\xFA");

hmmm, ist das so richtig?

PHP:
<?php
$fp = fsockopen("udp://127.0.0.1", 7666, $errno, $errstr);
if (!$fp) {
   echo "Fehler: $errno - $errstr<br>\n";
} else {
   fwrite($fp,"\xFA");
   fclose($fp);
}
?>

DadyCool
 
DadyCool schrieb:
xFA steht für 250?
Nein.
\xFA steht für "ú" dem Zeichen ASCII 250 eben.
xFA ist eine normale Zeichenkette ohne Sonderzeichen.

Ohne den Backslash würdest du 3 Zeichen senden. Nämlich ein kleines 'x', ein großes 'F' und ein großes 'A'.
PHP:
// diese sind gleichwertig
fwrite($socket_handle,"\xFA");
fwrite($socket_handle,"ú");
fwrite($socket_handle,chr(250));

// und diese sind auch gleichwertig
fwrite($socket_handle,"\x78\x46\x41");
fwrite($socket_handle,"xFA");
fwrite($socket_handle,chr(120).chr(70).chr(65));
Ich würd vorschlagen, du setzt dich mal etwas mit dem Hexadezimalsystem und dem PHP-Manual auseinander ;)
 
theHacker schrieb:
Nein.
\xFA steht für "ú" dem Zeichen ASCII 250 eben.
xFA ist eine normale Zeichenkette ohne Sonderzeichen.

Ohne den Backslash würdest du 3 Zeichen senden. Nämlich ein kleines 'x', ein großes 'F' und ein großes 'A'.
PHP:
// diese sind gleichwertig
fwrite($socket_handle,"\xFA");
fwrite($socket_handle,"ú");
fwrite($socket_handle,chr(250));

// und diese sind auch gleichwertig
fwrite($socket_handle,"\x78\x46\x41");
fwrite($socket_handle,"xFA");
fwrite($socket_handle,chr(120).chr(70).chr(65));
Ich würd vorschlagen, du setzt dich mal etwas mit dem Hexadezimalsystem und dem PHP-Manual auseinander ;)

Klar Hexadezimal :oops: DANKE für deine Mühe... werde ich morgen mal testen

DadyCool
 
super geht....

so jetzt muß ich nur noch die Antwort empfangen.
Der Client sendet an die Server IP + Port (der in fsockopen angegeben wurde) eine Antwort mit dem Wert 260 wie kann ich die Antwort im PHP auslesen?


DadyCool
 
DadyCool schrieb:
Der Client sendet an die Server IP + Port (der in fsockopen angegeben wurde) eine Antwort mit dem Wert 260 wie kann ich die Antwort im PHP auslesen?
260 ?! Das zeigst du mir :ugly:
Abgesehen davon, wenn du die Antwort schon kennst, wieso willst du sie dann empfangen ? ;)

Ich wiederhole mich ungern:
theHacker schrieb:
Einfach die Dateifunktionen benutzen, auch wenn es ein Socket is ;)