socket_read

From: Date: Wed, 04 Sep 2002 12:00:48 +0000
Subject: socket_read
Groups: php.general 
Request: Send a blank email to php-general+get-115159@lists.php.net to get a copy of this message
I'm having a problem with socket read, it's only reading one character. This may not sound so bad, but when you think that while it's reading all those one characters, it cannot read anyone else's (it blocks). Can anyone explain, or have a better way of doing this? Code below: <?php set_time_limit(0); define('MAXLINE', 255); define('LISTENQ', 10); define('PORT', 10000); function killDaemon() { global $listenfd, $client; socket_close($listenfd); $msg = "Daemon going down!\n"; for ($i = 0; $i < count($client); $i++) { if ($client[$i] != null) { socket_write($client[$i], $msg, strlen($msg)); socket_close($client[$i]); } } print "Shutting down the daemon\n"; exit(); } function closeClient($i) { global $client, $remote_host, $remote_port; print "closing client[$i] ({$remote_host[$i]}:{$remote_port[$i]})\n"; socket_close($client[$i]); $client[$i] = null; unset($remote_host[$i]); unset($remote_port[$i]); } $listenfd = socket_create(AF_INET, SOCK_STREAM, 0); if ($listenfd) print "Listening on port " . PORT . "\n"; else die("AIEE -- socket died!\n"); socket_setopt($listenfd, SOL_SOCKET, SO_REUSEADDR, 1); if (!socket_bind($listenfd, "127.0.0.1", PORT)) { socket_close($listenfd); die("AIEE -- Couldn't bind!\n"); } socket_listen($listenfd, LISTENQ); for ($i = 0; $i < 1; $i++) $client[$i] = null; while(1) { $rfds[0] = $listenfd; for ($i = 0; $i < count($client); $i++) { if ($client[$i] != null) $rfds[$i + 1] = $client[$i]; } $nready = socket_select($rfds, $null, $null, null); if (in_array($listenfd, $rfds)) { print "listenfd heard something, setting up new client\n"; for ($i = 0; $i <= count($client); $i++) { if ($client[$i] == null) { $client[$i] = socket_accept($listenfd); socket_setopt($client[$i], SOL_SOCKET, SO_REUSEADDR, 1); socket_getpeername($client[$i], $remote_host[$i], $remote_port[$i]); socket_write($client[$i], "Welcome to my test server\r\n"); print "Accepted {$remote_host[$i]}:{$remote_port[$i]} as client[$i]\n"; break; } } if (--$nready <= 0) continue; } for ($i = 0; $i < count($client); $i++) { if ($client[$i] == null) continue; if (in_array($client[$i], $rfds)) { $rawStr = ""; $n = ""; while (false !== ($n = socket_read($client[$i], MAXLINE))) { if (ord($n) == 0 || ord($n) == 13) break; if (ord($n) == 8) $rawStr = substr($rawStr, 0, -1); $rawStr .= $n; } if (trim($rawStr) == "") continue; if ($rawStr == "/killme") killDaemon(); else if ($rawStr == "/quit") closeClient($i); else { print "From {$remote_host[$i]}:{$remote_port[$i]}, client[$i]: $rawStr\n"; for ($j = 0; $j < count($client); $j++) { if ($client[$j] != null) socket_write($client[$j], "From client[$i]: $rawStr\r\n"); } if (--$nready <= 0) break; } } } //end of for loop } //end of master loop ?>

« previous php.general (#115159) next »