日期:2014-05-17 浏览次数:20444 次
function __construct ($address, $port) {
error_reporting (E_ALL);
set_time_limit (0);
ob_implicit_flush ();
// Socket creation
$this->master = socket_create (AF_INET, SOCK_STREAM, SOL_TCP) or die("socket_create() failed");
socket_set_option ($this->master, SOL_SOCKET, SO_REUSEADDR, 1) or die("socket_option() failed");
socket_bind ($this->master, $address, $port) or die("socket_bind() failed");
socket_listen ($this->master, 20) or die("socket_listen() failed");
$this->sockets[] = $this->master;
$this->say ("Server Started : " . date ('Y-m-d H:i:s'));
$this->say ("Listening on : {$address} {$port}");
$this->say ("Master socket : {$this->master}\n");
// Main loop
while (true) {
$changed = $this->sockets;
socket_select ($changed, $write = NULL, $except = NULL, NULL);
foreach ($changed as $socket) {
if ($socket == $this->master) {
$client = socket_accept ($this->master);
if ($client < 0) {
$this->log ("socket_accept() failed");
continue;
}
else {
// Connects the socket
$this->connect ($client);
}
}
else {
$bytes = @socket_recv ($socket, $buffer, 2048, 0);
if ($bytes == 0) {
// On socket.close ();
$this->disconnect ($socket);
}
else {
// Retrieve the user from his socket
$user = $this->getuserbysocket ($socket);
if (!$user->handshake) {
$this->dohandshake ($user, $buffer);
}
else {
$this->process ($user, $this->decode ($buffer));
}
}
}
}
}
}