summaryrefslogtreecommitdiff
path: root/pear
diff options
context:
space:
mode:
authorChuck Hagenbuch <chagenbu@php.net>2000-07-27 13:47:45 +0000
committerChuck Hagenbuch <chagenbu@php.net>2000-07-27 13:47:45 +0000
commit5ec120366cfc3e4400a4c86e9e24aa9a69bc61fc (patch)
tree00f425166bc50411b7bb639010346b28fad17443 /pear
parentf24c8c6f4bae54af4bc81924323388a332ff7575 (diff)
downloadphp-git-5ec120366cfc3e4400a4c86e9e24aa9a69bc61fc.tar.gz
Add a Socket class. If this should be somewhere other than top-level, just
let me know - none of the existing subdirectories made sense to me, and I didn't want to add a new one just for this.
Diffstat (limited to 'pear')
-rw-r--r--pear/Makefile.in3
-rw-r--r--pear/Socket.php194
2 files changed, 196 insertions, 1 deletions
diff --git a/pear/Makefile.in b/pear/Makefile.in
index 8840ce1e2f..8fb060ffbf 100644
--- a/pear/Makefile.in
+++ b/pear/Makefile.in
@@ -25,7 +25,8 @@ PEAR_FILES = \
HTTP.php \
File/Find.php \
PEAR.php \
- PEAR/Installer.php
+ PEAR/Installer.php \
+ Socket.php
install-data-local:
@if $(mkinstalldirs) $(peardir); then \
diff --git a/pear/Socket.php b/pear/Socket.php
new file mode 100644
index 0000000000..f5623f2411
--- /dev/null
+++ b/pear/Socket.php
@@ -0,0 +1,194 @@
+<?php
+//
+// +----------------------------------------------------------------------+
+// | PHP version 4.0 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1997, 1998, 1999, 2000 The PHP Group |
+// +----------------------------------------------------------------------+
+// | This source file is subject to version 2.0 of the PHP license, |
+// | that is bundled with this package in the file LICENSE, and is |
+// | available at through the world-wide-web at |
+// | http://www.php.net/license/2_02.txt. |
+// | If you did not receive a copy of the PHP license and are unable to |
+// | obtain it through the world-wide-web, please send a note to |
+// | license@php.net so we can mail you a copy immediately. |
+// +----------------------------------------------------------------------+
+// | Authors: Chuck Hagenbuch <chuck@horde.org> |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+//
+
+/**
+ * Generalized socket class, in roughly the same vein as the perl
+ * IO::Socket package.
+ *
+ * @author Chuck Hagenbuch <chuck@horde.org>
+ * @version $Revision$
+ */
+class Socket {
+
+ // {{{ properties
+
+ /** Number of bytes to read at a time in readline(). */
+ var $len = 2048;
+
+ /** Number of seconds to wait on socket connections before
+ assuming there's no more data. */
+ var $timeout = 100;
+
+ /** The hostname or IP address to connect to. */
+ var $host = '';
+
+ /** The port number to connect to. */
+ var $port = 0;
+
+ /** The socket handle. */
+ var $fp = 0;
+
+ /** The number of the most recent error. */
+ var $errno = 0;
+
+ /** The message associated with the most recent error. */
+ var $errstr = '';
+
+ // }}}
+
+
+ // {{{ constructor
+ /**
+ * Constructs a new Socket object.
+ *
+ * @param $host The hostname or IP address to connect to.
+ * @param $port The port number to connect to.
+ */
+ function Socket ($host, $port) {
+ $this->host = $host;
+ $this->port = $port;
+ }
+ // }}}
+
+
+ // {{{ open()
+ /**
+ * Attempt to open the socket connection.
+ *
+ * @return true on success, false on an error.
+ */
+ function open () {
+ $this->fp = fsockopen($this->host, $this->port, $this->errno, $this->errstr);
+ if (!$this->fp)
+ return false;
+ else
+ return true;
+ }
+ // }}}
+
+ // {{{ close()
+ /**
+ * Closes the socket connection, if it is opened.
+ */
+ function close () {
+ @fclose($this->fp);
+ }
+ // }}}
+
+ // {{{ send()
+ /**
+ * Write a line of data to the socket, followed by a trailing "\r\n".
+ *
+ * @return The fputs result.
+ */
+ function send ($data) {
+ return fputs($this->fp, "$data\r\n");
+ }
+ // }}}
+
+ // {{{ sendraw()
+ /**
+ * Write data to the socket with no modifications - no newlines
+ * are appended, etc..
+ *
+ * @return The fputs result.
+ */
+ function sendraw ($data) {
+ return fputs($this->fp, "$data");
+ }
+ // }}}
+
+ // {{{ error()
+ /**
+ * Convert the last error into a printable form.
+ *
+ * @return A string representation of an error message.
+ */
+ function error () {
+ return "$this->errstr ($this->errno)";
+ }
+ // }}}
+
+ // {{{ blocking()
+ /**
+ * Set the blocking to $mode. $mode can be anything which evaluates
+ * to true or false.
+ */
+ function blocking ($mode) {
+ set_socket_blocking($this->fp, $mode);
+ }
+ // }}}
+
+ // {{{ readline()
+ /**
+ * Read until either the end of the socket or a newline, whichever
+ * comes first. Strips the trailing newline from the returned data.
+ *
+ * @return All available data up to a newline, without that
+ * newline, or until the end of the socket.
+ */
+ function readline () {
+ $line = '';
+ $timeout = time() + $this->timeout;
+ while (!feof($this->fp) && time() < $timeout) {
+ $line .= fgets($this->fp, $this->len);
+ $len = strlen($line);
+ if ($len >=2 && substr($line, $len-2, 2) == "\r\n")
+ return substr($line, 0, $len-2);
+ }
+ return $line;
+ }
+ // }}}
+
+ // {{{ readall()
+ /**
+ * Read until the socket closes. THIS FUNCTION WILL NOT EXIT if the
+ * socket is in blocking mode until the socket closes.
+ *
+ * @return All data until the socket closes.
+ */
+ function readall () {
+ $data = '';
+ while (!feof($this->fp))
+ $data .= fread($this->fp, $this->len);
+ return $data;
+ }
+ // }}}
+
+ // {{{ readlen()
+ /**
+ * Read a specified amount of data. This is guaranteed to return,
+ * and has the added benefit of getting everything in one fread()
+ * chunk; if you know the size of the data you're getting
+ * beforehand, this is definitely the way to go.
+ *
+ * @param $len The number of bytes to read from the socket.
+ *
+ * @return $len bytes of data from the socket.
+ */
+ function readlen ($len) {
+ return fread($this->fp, $len);
+ }
+ // }}}
+
+}
+
+?>