ILIAS  release_5-1 Revision 5.0.0-5477-g43f3e3fab5f
Socket.php
Go to the documentation of this file.
1<?php
2//
3// +----------------------------------------------------------------------+
4// | PHP Version 4 |
5// +----------------------------------------------------------------------+
6// | Copyright (c) 1997-2003 The PHP Group |
7// +----------------------------------------------------------------------+
8// | This source file is subject to version 2.0 of the PHP license, |
9// | that is bundled with this package in the file LICENSE, and is |
10// | available at through the world-wide-web at |
11// | http://www.php.net/license/2_02.txt. |
12// | If you did not receive a copy of the PHP license and are unable to |
13// | obtain it through the world-wide-web, please send a note to |
14// | license@php.net so we can mail you a copy immediately. |
15// +----------------------------------------------------------------------+
16// | Authors: Stig Bakken <ssb@php.net> |
17// | Chuck Hagenbuch <chuck@horde.org> |
18// +----------------------------------------------------------------------+
19//
20// $Id: Socket.php,v 1.38 2008/02/15 18:24:17 chagenbu Exp $
21
22require_once 'PEAR.php';
23
24define('NET_SOCKET_READ', 1);
25define('NET_SOCKET_WRITE', 2);
26define('NET_SOCKET_ERROR', 4);
27
35class Net_Socket extends PEAR {
36
41 var $fp = null;
42
47 var $blocking = true;
48
53 var $persistent = false;
54
59 var $addr = '';
60
65 var $port = 0;
66
72 var $timeout = false;
73
79 var $lineLength = 2048;
80
97 function connect($addr, $port = 0, $persistent = null, $timeout = null, $options = null)
98 {
99 if (is_resource($this->fp)) {
100 @fclose($this->fp);
101 $this->fp = null;
102 }
103
104 if (!$addr) {
105 return $this->raiseError('$addr cannot be empty');
106 } elseif (strspn($addr, '.0123456789') == strlen($addr) ||
107 strstr($addr, '/') !== false) {
108 $this->addr = $addr;
109 } else {
110 $this->addr = @gethostbyname($addr);
111 }
112
113 $this->port = $port % 65536;
114
115 if ($persistent !== null) {
116 $this->persistent = $persistent;
117 }
118
119 if ($timeout !== null) {
120 $this->timeout = $timeout;
121 }
122
123 $openfunc = $this->persistent ? 'pfsockopen' : 'fsockopen';
124 $errno = 0;
125 $errstr = '';
126 $old_track_errors = @ini_set('track_errors', 1);
127 if ($options && function_exists('stream_context_create')) {
128 if ($this->timeout) {
130 } else {
131 $timeout = 0;
132 }
133 $context = stream_context_create($options);
134
135 // Since PHP 5 fsockopen doesn't allow context specification
136 if (function_exists('stream_socket_client')) {
137 $flags = $this->persistent ? STREAM_CLIENT_PERSISTENT : STREAM_CLIENT_CONNECT;
138 $addr = $this->addr . ':' . $this->port;
139 $fp = stream_socket_client($addr, $errno, $errstr, $timeout, $flags, $context);
140 } else {
141 $fp = @$openfunc($this->addr, $this->port, $errno, $errstr, $timeout, $context);
142 }
143 } else {
144 if ($this->timeout) {
145 $fp = @$openfunc($this->addr, $this->port, $errno, $errstr, $this->timeout);
146 } else {
147 $fp = @$openfunc($this->addr, $this->port, $errno, $errstr);
148 }
149 }
150
151 if (!$fp) {
152 if ($errno == 0 && isset($php_errormsg)) {
153 $errstr = $php_errormsg;
154 }
155 @ini_set('track_errors', $old_track_errors);
156 return $this->raiseError($errstr, $errno);
157 }
158
159 @ini_set('track_errors', $old_track_errors);
160 $this->fp = $fp;
161
162 return $this->setBlocking($this->blocking);
163 }
164
171 function disconnect()
172 {
173 if (!is_resource($this->fp)) {
174 return $this->raiseError('not connected');
175 }
176
177 @fclose($this->fp);
178 $this->fp = null;
179 return true;
180 }
181
188 function isBlocking()
189 {
190 return $this->blocking;
191 }
192
203 function setBlocking($mode)
204 {
205 if (!is_resource($this->fp)) {
206 return $this->raiseError('not connected');
207 }
208
209 $this->blocking = $mode;
210 socket_set_blocking($this->fp, $this->blocking);
211 return true;
212 }
213
223 function setTimeout($seconds, $microseconds)
224 {
225 if (!is_resource($this->fp)) {
226 return $this->raiseError('not connected');
227 }
228
229 return socket_set_timeout($this->fp, $seconds, $microseconds);
230 }
231
241 {
242 if (!is_resource($this->fp)) {
243 return $this->raiseError('not connected');
244 }
245
246 $returned = stream_set_write_buffer($this->fp, $size);
247 if ($returned == 0) {
248 return true;
249 }
250 return $this->raiseError('Cannot set write buffer.');
251 }
252
267 function getStatus()
268 {
269 if (!is_resource($this->fp)) {
270 return $this->raiseError('not connected');
271 }
272
273 return socket_get_status($this->fp);
274 }
275
283 function gets($size)
284 {
285 if (!is_resource($this->fp)) {
286 return $this->raiseError('not connected');
287 }
288
289 return @fgets($this->fp, $size);
290 }
291
303 function read($size)
304 {
305 if (!is_resource($this->fp)) {
306 return $this->raiseError('not connected');
307 }
308
309 return @fread($this->fp, $size);
310 }
311
324 function write($data, $blocksize = null)
325 {
326 if (!is_resource($this->fp)) {
327 return $this->raiseError('not connected');
328 }
329
330 if (is_null($blocksize) && !OS_WINDOWS) {
331 return @fwrite($this->fp, $data);
332 } else {
333 if (is_null($blocksize)) {
334 $blocksize = 1024;
335 }
336
337 $pos = 0;
338 $size = strlen($data);
339 while ($pos < $size) {
340 $written = @fwrite($this->fp, substr($data, $pos, $blocksize));
341 if ($written === false) {
342 return false;
343 }
344 $pos += $written;
345 }
346
347 return $pos;
348 }
349 }
350
357 function writeLine($data)
358 {
359 if (!is_resource($this->fp)) {
360 return $this->raiseError('not connected');
361 }
362
363 return fwrite($this->fp, $data . "\r\n");
364 }
365
374 function eof()
375 {
376 return (!is_resource($this->fp) || feof($this->fp));
377 }
378
386 function readByte()
387 {
388 if (!is_resource($this->fp)) {
389 return $this->raiseError('not connected');
390 }
391
392 return ord(@fread($this->fp, 1));
393 }
394
402 function readWord()
403 {
404 if (!is_resource($this->fp)) {
405 return $this->raiseError('not connected');
406 }
407
408 $buf = @fread($this->fp, 2);
409 return (ord($buf[0]) + (ord($buf[1]) << 8));
410 }
411
419 function readInt()
420 {
421 if (!is_resource($this->fp)) {
422 return $this->raiseError('not connected');
423 }
424
425 $buf = @fread($this->fp, 4);
426 return (ord($buf[0]) + (ord($buf[1]) << 8) +
427 (ord($buf[2]) << 16) + (ord($buf[3]) << 24));
428 }
429
437 function readString()
438 {
439 if (!is_resource($this->fp)) {
440 return $this->raiseError('not connected');
441 }
442
443 $string = '';
444 while (($char = @fread($this->fp, 1)) != "\x00") {
445 $string .= $char;
446 }
447 return $string;
448 }
449
457 function readIPAddress()
458 {
459 if (!is_resource($this->fp)) {
460 return $this->raiseError('not connected');
461 }
462
463 $buf = @fread($this->fp, 4);
464 return sprintf('%d.%d.%d.%d', ord($buf[0]), ord($buf[1]),
465 ord($buf[2]), ord($buf[3]));
466 }
467
477 function readLine()
478 {
479 if (!is_resource($this->fp)) {
480 return $this->raiseError('not connected');
481 }
482
483 $line = '';
484 $timeout = time() + $this->timeout;
485 while (!feof($this->fp) && (!$this->timeout || time() < $timeout)) {
486 $line .= @fgets($this->fp, $this->lineLength);
487 if (substr($line, -1) == "\n") {
488 return rtrim($line, "\r\n");
489 }
490 }
491 return $line;
492 }
493
507 function readAll()
508 {
509 if (!is_resource($this->fp)) {
510 return $this->raiseError('not connected');
511 }
512
513 $data = '';
514 while (!feof($this->fp)) {
515 $data .= @fread($this->fp, $this->lineLength);
516 }
517 return $data;
518 }
519
532 function select($state, $tv_sec, $tv_usec = 0)
533 {
534 if (!is_resource($this->fp)) {
535 return $this->raiseError('not connected');
536 }
537
538 $read = null;
539 $write = null;
540 $except = null;
541 if ($state & NET_SOCKET_READ) {
542 $read[] = $this->fp;
543 }
544 if ($state & NET_SOCKET_WRITE) {
545 $write[] = $this->fp;
546 }
547 if ($state & NET_SOCKET_ERROR) {
548 $except[] = $this->fp;
549 }
550 if (false === ($sr = stream_select($read, $write, $except, $tv_sec, $tv_usec))) {
551 return false;
552 }
553
554 $result = 0;
555 if (count($read)) {
557 }
558 if (count($write)) {
560 }
561 if (count($except)) {
563 }
564 return $result;
565 }
566
580 function enableCrypto($enabled, $type)
581 {
582 if (version_compare(phpversion(), "5.1.0", ">=")) {
583 if (!is_resource($this->fp)) {
584 return $this->raiseError('not connected');
585 }
586 return @stream_socket_enable_crypto($this->fp, $enabled, $type);
587 } else {
588 return $this->raiseError('Net_Socket::enableCrypto() requires php version >= 5.1.0');
589 }
590 }
591
592}
$result
$size
Definition: RandomTest.php:79
const NET_SOCKET_ERROR
Definition: Socket.php:26
const NET_SOCKET_READ
Definition: Socket.php:24
const NET_SOCKET_WRITE
Definition: Socket.php:25
Generalized Socket class.
Definition: Socket.php:35
read($size)
Read a specified amount of data.
Definition: Socket.php:303
eof()
Tests for end-of-file on a socket descriptor.
Definition: Socket.php:374
setBlocking($mode)
Sets whether the socket connection should be blocking or not.
Definition: Socket.php:203
gets($size)
Get a specified line of data.
Definition: Socket.php:283
disconnect()
Disconnects from the peer, closes the socket.
Definition: Socket.php:171
enableCrypto($enabled, $type)
Turns encryption on/off on a connected socket.
Definition: Socket.php:580
setWriteBuffer($size)
Sets the file buffering size on the stream.
Definition: Socket.php:240
writeLine($data)
Write a line of data to the socket, followed by a trailing "\r\n".
Definition: Socket.php:357
$port
The port number to connect to.
Definition: Socket.php:65
readWord()
Reads a word of data.
Definition: Socket.php:402
readByte()
Reads a byte of data.
Definition: Socket.php:386
isBlocking()
Find out if the socket is in blocking mode.
Definition: Socket.php:188
readIPAddress()
Reads an IP Address and returns it in a dot formatted string.
Definition: Socket.php:457
setTimeout($seconds, $microseconds)
Sets the timeout value on socket descriptor, expressed in the sum of seconds and microseconds.
Definition: Socket.php:223
readLine()
Read until either the end of the socket or a newline, whichever comes first.
Definition: Socket.php:477
select($state, $tv_sec, $tv_usec=0)
Runs the equivalent of the select() system call on the socket with a timeout specified by tv_sec and ...
Definition: Socket.php:532
$addr
The IP address to connect to.
Definition: Socket.php:59
connect($addr, $port=0, $persistent=null, $timeout=null, $options=null)
Connect to the specified port.
Definition: Socket.php:97
readInt()
Reads an int of data.
Definition: Socket.php:419
$fp
Socket file pointer.
Definition: Socket.php:41
write($data, $blocksize=null)
Write a specified amount of data.
Definition: Socket.php:324
getStatus()
Returns information about an existing socket resource.
Definition: Socket.php:267
$timeout
Number of seconds to wait on socket connections before assuming there's no more data.
Definition: Socket.php:72
readAll()
Read until the socket closes, or until there is no more data in the inner PHP buffer.
Definition: Socket.php:507
$blocking
Whether the socket is blocking.
Definition: Socket.php:47
readString()
Reads a zero-terminated string of data.
Definition: Socket.php:437
$persistent
Whether the socket is persistent.
Definition: Socket.php:53
$lineLength
Number of bytes to read at a time in readLine() and readAll().
Definition: Socket.php:79
& raiseError($message=null, $code=null, $mode=null, $options=null, $userinfo=null, $error_class=null, $skipmsg=false)
This method is a wrapper that returns an instance of the configured error class with this object's de...
Definition: PEAR.php:524
$data
if(!is_array($argv)) $options