Hi,
I have a chat server written in PHP which support multiple users. It works fine. But, when I leave the server idle, that is no user sends any message for some time say 5 mins. Then server appears to be hanged. Not fully hanged though. It’s able to accept new user but it doesn’t broadcast messages. I am guessing somekind of timeout is happening. Although I have set no time out to happen in socket_select() . sockt_read() function is called to read character by character. Below is the main part of the code…
$s_client == array ();
$abort = false;
while (!$abort)
$set = array_merge((array)$s_listen, $s_clients);
//$set[0] = $s_listen;
//foreach(
//if (socket_select($set, $write = NULL, $expect = NULL, 1, 0) > 0) {
if (socket_select($set, $write = NULL, $expect = NULL, $tv_sec=NULL) > 0) {
foreach ($set as $sock) {
/* listening socket has a connection, deal with it */
if ($sock == $s_listen) {
if (!($newc = socket_accept($s_listen)))
myerror();
else {
/* add socket to client list and announce connection */
echo "Adding a new socket...
";
$s_clients[$newc]= $newc;
socket_getpeername($newc, $addr);
$cdata[$newc]['addr'] = $addr;
$cdata[$newc]['buf'] = '';
$cdata[$newc]['state'] = STATE_NICKNAME;
echo "[connection]: $addr
";
send_single($newc,'############Welcome to Indiwin Chat############');
send_single($newc, 'Enter a nickname:');
}
}
else {
if (($read = socket_read($sock, 1024)) === false || $read == '') {
if ($read != '')
myerror();
else /* no error, but connection was closed, so tell everyone */
on_quit($sock);
/* remove client from arrays */
unset($s_clients[$sock]);
unset($cdata[$sock]);
}
else {
/* only want data with a newline */
if (strchr($read, "
") === false)
//...rest part fo code not shown
I am using PUTTY, or dos telnet client to interact with server. I assume that these client insert ’
\r’ after we hit enter.
Any idea why does server hangs when left idle for approx 5 minutes?
Thank you
Shubhankar