Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [PHP] Socket listen mit Timeout (https://www.delphipraxis.net/164210-%5Bphp%5D-socket-listen-mit-timeout.html)

rollstuhlfahrer 2. Nov 2011 17:33

[PHP] Socket listen mit Timeout
 
HI @all,

ich möchte mir ein kleines PHP-Skript zusammenbauen, welches die folgenden Funktionen hat:
  1. Einen UDP-Broadcast verschicken
  2. Einen TCP-Socket aufbauen und darauf lauschen
  3. Wenn nach eine bestimmten Zeit keine Verbindung kam, den Socket wieder schließen und das Skript beenden
  4. Wenn doch in der Zwischenzeit eine Verbindung kam, dann eine Datei anlegen und dann das Skript beenden

Die ersten beiden Punkte habe ich schon fertig, nur habe ich keine Ahnung, wie mal einen Timeout bei Sockets mit PHP hinbekommt. Als Idee hatte ich, einen Fork zu erstellen und den nach einem Timeout einfach abzuschießen, aber Forks gehen mit Windows nicht.

Als Anforderung: Das Skript sollte möglichst unter beiden Systemen laufen: Windows und Ubuntu.

PHP-Quellcode:
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($socket, "127.0.0.1", 4567);

socket_listen($socket,1);
$dataSock = socket_accept($socket);
echo socket_read($dataSock, 1024, PHP_NORMAL_READ);
// close sockets
socket_close($socket);
?>
Das ist der Code, der auf die Verbindung wartet.

So: Wie sage ich jetzt PHP, dass es einen Timeout gibt?

Bernhard

BUG 2. Nov 2011 23:45

AW: [PHP] Socket listen mit Timeout
 
Mal ein kleiner Codeausschnitt:
Code:
$socket=@fsockopen($address, $port, $errno, $errstr, $timeout);
if ($socket != false) {
  echo "online";
  fclose($socket);
} else {
  echo "timeout";
}
//EDIT: Mist, erst jetzt richtig realisiert das es um einen Server geht :wall:

rollstuhlfahrer 6. Nov 2011 13:58

AW: [PHP] Socket listen mit Timeout
 
Ok, ich habe jetzt eine funktionierende Lösung:

Der Eltern-Prozess erzeugt einen Fork und wartet den Timeout ab.
Im Kind-Prozess wird der Socket erzeugt und auf Listen geschalten.
Wenn dann der Timeout abgelaufen ist, verbindet sich der Eltern-Prozess per Socket auf den Kind-Prozess und teilt diesem mit, dass das Timeout erreicht ist. Danach beendet der Kind-Prozess das lauschen und beendet sich selbet.
Nur ist das nicht mehr unter Windows lauffähig, funktioniert aber.

Bernhard


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz