| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 | <?php/** * This file is part of workerman. * * Licensed under The MIT License * For full copyright and license information, please see the MIT-LICENSE.txt * Redistributions of files must retain the above copyright notice. * * @author    walkor<walkor@workerman.net> * @copyright walkor<walkor@workerman.net> * @link      http://www.workerman.net/ * @license   http://www.opensource.org/licenses/mit-license.php MIT License */namespace Workerman\Connection;/** * UdpConnection. */class UdpConnection extends ConnectionInterface{    /**     * Application layer protocol.     * The format is like this Workerman\\Protocols\\Http.     *     * @var \Workerman\Protocols\ProtocolInterface     */    public $protocol = null;    /**     * Udp socket.     *     * @var resource     */    protected $_socket = null;    /**     * Remote address.     *     * @var string     */    protected $_remoteAddress = '';    /**     * Construct.     *     * @param resource $socket     * @param string   $remote_address     */    public function __construct($socket, $remote_address)    {        $this->_socket        = $socket;        $this->_remoteAddress = $remote_address;    }    /**     * Sends data on the connection.     *     * @param string $send_buffer     * @param bool   $raw     * @return void|boolean     */    public function send($send_buffer, $raw = false)    {        if (false === $raw && $this->protocol) {            $parser      = $this->protocol;            $send_buffer = $parser::encode($send_buffer, $this);            if ($send_buffer === '') {                return null;            }        }        return strlen($send_buffer) === stream_socket_sendto($this->_socket, $send_buffer, 0, $this->_remoteAddress);    }    /**     * Get remote IP.     *     * @return string     */    public function getRemoteIp()    {        $pos = strrpos($this->_remoteAddress, ':');        if ($pos) {            return trim(substr($this->_remoteAddress, 0, $pos), '[]');        }        return '';    }    /**     * Get remote port.     *     * @return int     */    public function getRemotePort()    {        if ($this->_remoteAddress) {            return (int)substr(strrchr($this->_remoteAddress, ':'), 1);        }        return 0;    }    /**     * Get remote address.     *     * @return string     */    public function getRemoteAddress()    {        return $this->_remoteAddress;    }    /**     * Get local IP.     *     * @return string     */    public function getLocalIp()    {        $address = $this->getLocalAddress();        $pos = strrpos($address, ':');        if (!$pos) {            return '';        }        return substr($address, 0, $pos);    }    /**     * Get local port.     *     * @return int     */    public function getLocalPort()    {        $address = $this->getLocalAddress();        $pos = strrpos($address, ':');        if (!$pos) {            return 0;        }        return (int)substr(strrchr($address, ':'), 1);    }    /**     * Get local address.     *     * @return string     */    public function getLocalAddress()    {        return (string)@stream_socket_get_name($this->_socket, false);    }    /**     * Is ipv4.     *     * return bool.     */    public function isIpV4()    {        if ($this->transport === 'unix') {            return false;        }        return strpos($this->getRemoteIp(), ':') === false;    }    /**     * Is ipv6.     *     * return bool.     */    public function isIpV6()    {        if ($this->transport === 'unix') {            return false;        }        return strpos($this->getRemoteIp(), ':') !== false;    }    /**     * Close connection.     *     * @param mixed $data     * @param bool  $raw     * @return bool     */    public function close($data = null, $raw = false)    {        if ($data !== null) {            $this->send($data, $raw);        }        return true;    }}
 |