af666cea3d1da4fc346be5902c2b21a7dd9121f5
[PHP-P10.git] / Uplink / Client.class.php
1 <?php
2 /********************************* PHP-P10 ******************************
3  *    P10 uplink class by pk910   (c)2011 pk910                         *
4  ************************************************************************
5  *                          Version 2 (OOP)                             *
6  *                                                                      *
7  * PHP-P10 is free software; you can redistribute it and/or modify      *
8  * it under the terms of the GNU General Public License as published by *
9  * the Free Software Foundation; either version 2 of the License, or    *
10  * (at your option) any later version.                                  *
11  *                                                                      *
12  * This program is distributed in the hope that it will be useful,      *
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of       *
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        *
15  * GNU General Public License for more details.                         *
16  *                                                                      *
17  * You should have received a copy of the GNU General Public License    *
18  * along with PHP-P10; if not, write to the Free Software Foundation,   *
19  * Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.       *
20  *                                                                      *
21  ************************************************************************
22  * 
23  *  Uplink/Client.class.php
24  *
25  * This file contains the basic Client Socket.
26  *
27  ************************************************************************
28  * accessable methods:
29  *
30  * bool connect(String $host, int $port, String $bind = null, bool $ssl = false, int $blocking = 0)
31  *     connects the socket to $host:$port with the provided options
32  *
33  * void disconnect()
34  *     disconnects the socket
35  *
36  * bool connected()
37  *     returns the state of the socket (true if the socket is connected with the server)
38  *
39  * String[] recv()
40  *     tries to receive datas from the socket. Returns null or a array containing the lines received.
41  *     this method BLOCKS THE SCRIPT EXECUTION for the defined time if $blocking is set on connect().
42  *
43  * void send(String $line, String $newline = "\r\n")
44  *     tries to send datas through the socket.
45  *
46  * Array[] getTraffic()
47  *     returns an array containing the traffic the socket has received and sent.
48  *     index in = incoming (received) traffic count
49        index out = outgoing (sent) traffic count
50  */
51
52 class Client {
53         const CLIENT_RECV_MAX_LINES = 20; //maximum Lines to receive within one recv() call
54         
55         private $socket;
56         private $traffic = array("in" => 0, "out" => 0);
57         private $timeout;
58         
59         public function connect($host, $port, $bind = null, $ssl = false, $blocking = 0) {
60                 if($bind)
61                         $options = array('socket' => array('bindto' => $bind.":0"));
62                 else
63                         $options = array();
64                 $context = stream_context_create($options);
65                 $sock = stream_socket_client(($ssl ? 'ssl://' : '').$host.':'.$port, $errno, $errstr, 3, STREAM_CLIENT_CONNECT, $context);
66                 if($sock) {
67                         $this->timeout = $blocking * 1000;
68                         stream_set_blocking($sock, false);
69                         $this->socket = $sock;
70                         return true;
71                 } else
72                         return false;
73         }
74         
75         public function disconnect() {
76                 if($this->socket == null) return;
77                 fclose($this->socket);
78                 $this->socket = null;
79         }
80         
81         public function connected() {
82                 if($this->socket == null) return false;
83                 $read = array($this->socket);
84                 $write= null;
85                 $except=null;
86                 $n=@stream_select($read, $write, $except, 0);
87                 if($n === FALSE || feof($this->socket)) {
88                         $this->socket = false;
89                         return false;
90                 }
91                 return true;
92         }
93         
94         public function recv() {
95                 $read = array($this->socket);
96                 $write= null;
97                 $except=null;
98                 $n=@stream_select($read, $write, $except, 0, $this->timeout);
99                 if($n === FALSE || feof($this->socket)) {
100                         $this->socket = false;
101                         return null;
102                 } elseif($n > 0) {
103                         $lines = array();
104                         while(($line = @fgets($this->socket)) != null) {
105                                 $line=trim($line);
106                                 if(!empty($line)) {
107                                         echo"[recv] ".utf8_decode($line)."\n";
108                                         $this->traffic['in'] += strlen($line);
109                                         $lines[] = $line;
110                                         if(count($lines) >= self::CLIENT_RECV_MAX_LINES) break;
111                                 }
112                         }
113                         return $lines;
114                 }
115                 return null;
116         }
117         
118         public function send($line, $newline = "\r\n") {
119                 if($this->socket == null) return;
120                 echo"[send] ".utf8_decode($line)."\n";
121                 $this->traffic['out'] += strlen($line);
122                 fwrite($this->socket,$line.$newline);
123         }
124         
125         public function getTraffic() {
126                 return $this->traffic;
127         }
128 }
129
130 ?>