Probier doch erstmal eine einfache Socket-Verbindung herzustellen, bevor du aufgibst - ohne den Socket Server, sondern mit einem einfachen Script.
Das rufst du dann von deinem Computer über Telnet auf. Damit bist du am rudimentärsten Element.
Das rufst du dann von deinem Computer über Telnet auf. Damit bist du am rudimentärsten Element.
Du sagst, dass du den Port nicht festlegst, sondern das System das macht...
Wieso?
Wieso?
Deshalb soll das System den Port festlegen. Der verwendete Port wird dann in einer Datei auf dem Server abgelegt,
die sich natürlich de Client holen muss bevor er die Verbindung aufsetzt.
PHP-Code:
// Create TCP/IP stream socket
// Bei TCP ist garantiert, dass alle Datenpakete in derselben Reihenfolge empfangen werden, in der sie gesendet wurden
if (($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
logger("socket_create() fehlgeschlagen: Grund: " . socket_strerror(socket_last_error()) . "\n";
}
else {
logger(__LINE__. "\t ".basename(__FILE__)." socket_create() SUCCESS \tHOST=".$host);
}
//reuseable port
// Um beispielsweise Optionen auf dem Socket-Level abzufragen,
// würde man den Parameter level auf den Wert SOL_SOCKET setzen.
// socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
if (!socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1)) {
logger(__LINE__. '\t Error: Kann keine Option setzen für Socket: '. socket_strerror(socket_last_error())) . PHP_EOL;
}
// bind socket to (0=un)specified host and port
// socket_bind($socket, 0,$port);
// Bindet an festen Port, dieser muss aber frei sein
// das ist beim Provider schlecht möglich.
// deshalb wird der Port nicht mit angegeben
// Das System entscheidet jetzt welcher Port verwendet wird.
// Das Problem, wie kommen die Clients an die Portnummer um sich zu verbinden
// wird dann über socket_getsockname gelöst
socket_bind($socket, $host);
//listen to port
socket_listen($socket);
// socket_getsockname liefert die IP und der Port zurück.
socket_getsockname($socket, $OWN_IP, $PORT);
$pid=getmypid();
$socket_data=array('pid'=>$pid,'serv_ip'=>$OWN_IP,'port'=>$PORT);
// Der Port wird in einer Datei abgelegt und kann dort von
// den Clients gelesen werden
file_put_contents($pfad."/tmp/socket_data.json",json_encode($socket_data));
while(true) {
tick_handler(); // fängt Signale SIGTERM; SIGINT, SIGKILL ab und und leitet Prozessbeendigung ein
// Verarbeitung der einkommenden Requests
sleep($sleep_time);
} // Ende while true
Ich habe den automatischen Kill nach 120 Sekunden deshalb eingebaut, damit ich den Server nicht unnötig belasten.
Es sind aber nicht absolut 120 Sekunden, sondern 120 Sekunden nach der letzten Aktivitaet. D.h. wenn nach 110 Sek ein Request kommt,
startetn wieder 120 Sekunden.
Ich bin mir Klar darüber, dass die Laufzeit eines Scriptes begrenzt ist. da das Socket Script aber mit nohup aufgesetzt wird, sollte es eigentlich mit limit=0 laufen
(kann ich ja noch mal testen).
Es soll ja auch nicht durchgehend laufen, die Webseite ist nicht so frequentiert, dass das nötig wäre. Es müssten auch mehrere Benutzer gleichzeitig dran hängen,
die miteinander kommunizieren wollen.
Ich möchte keinen kleinen Vserver bei einem anderen Hoster verwenden, da ich dann Content-Security-Probleme habe.
Ich habe in meine Scripte CSP eingebaut und möchte das nicht gleich wieder durchlöchern.
Da das ja alles so funktioniert, wie ich mir das vorgestellt habe, wenn es auf localhost läuft, ist wahrscheinlich nur die Firewall des Providers das Problem.
Ich muss mich mal mit denen in Verbindung setzen, ob es da eine Lösung gibt.
Ansonsten bleibt es beim Long Polling, ich könnte da ja dann die Frequenz erhöhen, d.h. häufiger pollen um eine kürzere Reaktionzeit zu bekommen.
Kommentar