• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

WebSocket mit PHP

BennyKlotz

Neues Mitglied
Arbeite in letzter Zeit mit PHP Sockets

Hier der Quellcode
PHP:
<? 
// set some variables 
$host = "localhost"; $port = 1234; 
// don't timeout! 
set_time_limit(0); 
// create socket 
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
 // bind socket to port 
$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n"); 
// start listening for connections 
$result = socket_listen($socket, 3) or die("Could not set up socket listener\n"); 
// accept incoming connections 
// spawn another socket to handle communication 
$spawn = socket_accept($socket) or die("Could not accept incoming connection\n"); 
// read client input 
$input = socket_read($spawn, 1024) or die("Could not read input\n"); 
// clean up input string 
$input = trim($input); 
// reverse client input and send back 
$output = strrev($input) . "\n"; socket_write($spawn, $output, strlen ($output)) or die("Could not write output\n"); 
// close sockets 
socket_close($spawn); 
socket_close($socket);
 
?>

Mein Problem ist nun bei Beendigung des Programms wird die Adresse durch socket_close() normalerweise wieder freigegeben und socket_bind() für die selbe Adresse sollte funktionieren.

Das tut es aber nicht...


benny@benny-laptop:~$ sudo php -q /opt/lampp/htdocs/websocket/server.php
PHP Warning: socket_bind(): unable to bind address [98]: Address already in use in /opt/lampp/htdocs/websocket/server.php on line 9
Could not bind to socket

Meine Frage ist nun wieso ist das so?

MFG Benny
 
Die Meldung wird zwar unterdrückt aber bind_socket() funktioniert trotzdem nicht...

benny@benny-laptop:~$ sudo php -q /opt/lampp/htdocs/websocket/server.php
Could not bind to socket

MFG benny
 
achso es geht erst garnicht???
Doch müsste aber.... nur das es sofort beendet wird... ich würde da erstmal eine schleife laufen lassen... sonst baut er auf, fragt ob was ankommt und wird gleich wieder beendet.
 
Ja das mit der Schleife kommt noch war ja nur zum Verständnis und Testzwecke
Aber es müsste ja funktionieren weil wie schon erwähnt bei socket_close() die Adresse und der Port wieder freigegeben werden sollten und somit bei erneuten Anlauf bei socket_bind('Socket', 'Adresse', 'Port') keine Adresskonflikte zustande kommen sollten...
Was mir aufgefallen ist, dass nach einer kurzen Wartezeit alles wie gehabt funktioniert...
Hab mich mal bei socket_close() auf php Manual eingelesen und dort steht bei User Contributed Notes:

Summary: close() does not relinquish socket immediately.

Was für mich soviel bedeutet wie, der Socket zwar anscheinend geschlossen wird aber dennoch die Adresse nicht freigegeben wird...

Habe auch probiert vorher socket_shutdown() anzuwenden und dann socket_close() , was aber kein Unterschied macht...

MFG Benny
 
PHP ist da sehr vorsichtig und baut die Verbindung langsam ab... darum die wartezeit zwischen einen neuen connect.
 
Zurück
Oben