/**
  * Creates a new connection with the specified options.
  * 
  * @param resource   $server  A socket server, created with
  *     {@link stream_socket_server()}.
  * @param float|null $timeout The timeout for the connection. Leaving this
  *     to NULL uses the default socket timeout.
  */
 public function __construct($server, $timeout = null)
 {
     $this->streamType = '_SERVER';
     if (!self::isStream($server)) {
         throw $this->createException('Invalid server supplied.', 9);
     }
     $timeout = null == $timeout ? ini_get('default_socket_timeout') : $timeout;
     set_error_handler(array($this, 'handleError'));
     try {
         parent::__construct(stream_socket_accept($server, $timeout, $peerName));
         restore_error_handler();
         $portString = strrchr($peerName, ':');
         $this->peerPort = (int) substr($portString, 1);
         $ipString = substr($peerName, 0, strlen($peerName) - strlen($portString));
         if (strpos($ipString, '[') === 0 && strpos(strrev($ipString), ']') === 0) {
             $ipString = substr($ipString, 1, strlen($ipString) - 2);
         }
         $this->peerIP = $ipString;
     } catch (E $e) {
         restore_error_handler();
         throw $this->createException('Failed to initialize connection.', 10, $e);
     }
 }
 /**
  * Creates a new connection with the specified options.
  * 
  * @param string   $host    Hostname (IP or domain) of the server.
  * @param int      $port    The port on the server.
  * @param bool     $persist Whether or not the connection should be a
  *     persistent one.
  * @param float    $timeout The timeout for the connection.
  * @param string   $key     A string that uniquely identifies the
  *     connection.
  * @param string   $crypto  Encryption setting. Must be one of the
  *     NetworkStream::CRYPTO_* constants. By default, encryption is
  *     disabled. If the setting has an associated scheme for it, it will be
  *     used, and if not, the setting will be adjusted right after the
  *     connection is estabilished.
  * @param resource $context A context for the socket.
  */
 public function __construct($host, $port, $persist = false, $timeout = null, $key = '', $crypto = parent::CRYPTO_OFF, $context = null)
 {
     $this->streamType = '_CLIENT';
     if (strpos($host, ':') !== false) {
         $host = "[{$host}]";
     }
     $flags = STREAM_CLIENT_CONNECT;
     if ($persist) {
         $flags |= STREAM_CLIENT_PERSISTENT;
     }
     $timeout = null == $timeout ? ini_get('default_socket_timeout') : $timeout;
     $key = rawurlencode($key);
     if (null === $context) {
         $context = stream_context_get_default();
     } elseif (!is_resource($context) || 'stream-context' !== get_resource_type($context)) {
         throw $this->createException('Invalid context supplied.', 6);
     }
     $hasCryptoScheme = array_key_exists($crypto, static::$cryptoScheme);
     $scheme = $hasCryptoScheme ? static::$cryptoScheme[$crypto] : 'tcp';
     $this->uri = "{$scheme}://{$host}:{$port}/{$key}";
     set_error_handler(array($this, 'handleError'));
     try {
         parent::__construct(stream_socket_client($this->uri, $this->errorNo, $this->errorStr, $timeout, $flags, $context));
         restore_error_handler();
     } catch (E $e) {
         restore_error_handler();
         if (0 === $this->errorNo) {
             throw $this->createException('Failed to initialize socket.', 7, $e);
         }
         throw $this->createException('Failed to connect with socket.', 8, $e);
     }
     if ($hasCryptoScheme) {
         $this->crypto = $crypto;
     } elseif (parent::CRYPTO_OFF !== $crypto) {
         $this->setCrypto($crypto);
     }
     $this->setIsBlocking(parent::CRYPTO_OFF === $crypto);
     if ($persist) {
         $this->shmHandler = SHM::factory(__CLASS__ . ' ' . $this->uri . ' ');
         self::$lockState[$this->uri] = self::DIRECTION_NONE;
     }
 }