. * * * ************************************************************************ * * Uplink/Client.class.php * * This file contains the basic Client Socket. * */ class Client { const CLIENT_RECV_MAX_LINES = 20; //maximum Lines to receive within one recv() call private $socket; private $traffic = array("in" => 0, "out" => 0); private $timeout; public function connect($host, $port, $bind = null, $ssl = false, $blocking = 0) { if($bind) $options = array('socket' => array('bindto' => $bind.":0")); else $options = array(); $context = stream_context_create($options); $sock = stream_socket_client(($ssl ? 'ssl://' : '').$host.':'.$port, $errno, $errstr, 3, STREAM_CLIENT_CONNECT, $context); if($sock) { $this->timeout = $blocking * 1000; stream_set_blocking($sock, false); $this->socket = $sock; return true; } else return false; } public function disconnect() { if($this->socket == null) return; fclose($this->socket); $this->socket = null; } public function connected() { if($this->socket == null) return false; $read = array($this->socket); $write= null; $except=null; $n=@stream_select($read, $write, $except, 0); if($n === FALSE || feof($this->socket)) { $this->socket = false; return false; } return true; } public function recv() { $read = array($this->socket); $write= null; $except=null; $n=@stream_select($read, $write, $except, 0, $this->timeout); if($n === FALSE || feof($this->socket)) { $this->socket = false; return null; } elseif($n > 0) { $lines = array(); while(($line = @fgets($this->socket)) != null) { $line=trim($line); if(!empty($line)) { echo"[recv] ".utf8_decode($line)."\n"; $this->traffic['in'] += strlen($line); $lines[] = $line; if(count($lines) >= self::CLIENT_RECV_MAX_LINES) break; } } return $lines; } return null; } public function send($line, $newline = "\r\n") { if($this->socket == null) return; echo"[send] ".utf8_decode($line)."\n"; $this->traffic['out'] += strlen($line); fwrite($this->socket,$line.$newline); } public function getTraffic() { return $this->traffic; } } ?>