示例#1
5
 public function run()
 {
     $null = NULL;
     $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
     socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
     socket_bind($socket, $this->host, $this->port);
     socket_listen($socket);
     socket_set_nonblock($socket);
     $this->clients = array($socket);
     //start endless loop
     while (true) {
         $changed = $this->clients;
         socket_select($changed, $null, $null, 0, 10);
         //check for new socket
         if (in_array($socket, $changed)) {
             if (($socket_new = socket_accept($socket)) !== false) {
                 $this->clients[] = $socket_new;
                 $header = socket_read($socket_new, 1024);
                 if ($this->handshake($header, $socket_new) === false) {
                     continue;
                 }
                 socket_getpeername($socket_new, $ip);
                 if (isset($this->events['open'])) {
                     $this->events['open']($this, $ip);
                 }
                 $found_socket = array_search($socket, $changed);
                 unset($changed[$found_socket]);
             }
         }
         //loop through all connected sockets
         foreach ($changed as $changed_socket) {
             //check for any incomming data
             while (socket_recv($changed_socket, $buf, 1024, 0) >= 1) {
                 $received_text = $this->unmask($buf);
                 //unmask data
                 $data = json_decode($received_text, true);
                 //json decode
                 if (isset($this->events['message'])) {
                     $this->events['message']($this, $data);
                 }
                 break 2;
             }
             $buf = socket_read($changed_socket, 1024, PHP_NORMAL_READ);
             // check disconnected client
             if ($buf === false) {
                 $found_socket = array_search($changed_socket, $this->clients);
                 socket_getpeername($changed_socket, $ip);
                 unset($this->clients[$found_socket]);
                 if (isset($this->events['close'])) {
                     $this->events['close']($this, $ip);
                 }
             }
         }
         if ($this->timeout) {
             sleep($this->timeout);
         }
     }
     socket_close($socket);
 }
示例#2
2
 public function run()
 {
     while (true) {
         $changed_sockets = $this->allsockets;
         @socket_select($changed_sockets, $write = NULL, $exceptions = NULL, NULL);
         foreach ($changed_sockets as $socket) {
             if ($socket == $this->master) {
                 if (($ressource = socket_accept($this->master)) < 0) {
                     $this->log('Socket error: ' . socket_strerror(socket_last_error($ressource)));
                     continue;
                 } else {
                     $client = new Connection($this, $ressource);
                     $this->clients[$ressource] = $client;
                     $this->allsockets[] = $ressource;
                 }
             } else {
                 $client = $this->clients[$socket];
                 $bytes = @socket_recv($socket, $data, 4096, 0);
                 if ($bytes === 0) {
                     $client->onDisconnect();
                     unset($this->clients[$socket]);
                     $index = array_search($socket, $this->allsockets);
                     unset($this->allsockets[$index]);
                     unset($client);
                 } else {
                     $client->onData($data);
                 }
             }
         }
     }
 }
示例#3
1
function getinfoToRPi($command)
{
    if (!($sock = socket_create(AF_INET, SOCK_STREAM, 0))) {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);
        die("Couldn't create socket: [{$errorcode}] {$errormsg} \n");
    }
    //Connect socket to remote server
    try {
        $varConnection = socket_connect($sock, '172.17.10.71', 1111);
    } catch (Exception $e) {
        var_dump($e);
    }
    if (!$varConnection) {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);
        return False;
    }
    //Send the message to the server
    if (!socket_write($sock, $command, strlen($command))) {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);
        return False;
    }
    $buff = "";
    if (False !== ($bytes = socket_recv($sock, $buff, 10, MSG_WAITALL))) {
        return $buff;
    }
    return False;
}
示例#4
0
 public function index()
 {
     error_reporting(~E_WARNING);
     $server = '127.0.0.1';
     $port = 9999;
     if (!($sock = socket_create(AF_INET, SOCK_DGRAM, 0))) {
         $errorcode = socket_last_error();
         $errormsg = socket_strerror($errorcode);
         die("Couldn't create socket: [{$errorcode}] {$errormsg} \n");
     }
     echo "Socket created \n";
     echo 'Enter a message to send : ';
     $input = 'abc';
     //Send the message to the server
     if (!socket_sendto($sock, $input, strlen($input), 0, $server, $port)) {
         $errorcode = socket_last_error();
         $errormsg = socket_strerror($errorcode);
         die("Could not send data: [{$errorcode}] {$errormsg} \n");
     }
     //Now receive reply from server and print it
     if (socket_recv($sock, $reply, 5, 256) === false) {
         $errorcode = socket_last_error();
         $errormsg = socket_strerror($errorcode);
         die("Could not receive data: [{$errorcode}] {$errormsg} \n");
     }
     echo "Reply : {$reply}";
 }
示例#5
0
 /**
  *@name    run
  *@desc    wait for the client to connect and process
  */
 public function run()
 {
     while (true) {
         $socketArr = $this->sockets;
         $write = NULL;
         $except = NULL;
         socket_select($socketArr, $write, $except, NULL);
         //select the socket with message automaticly
         //if handshake choose the master
         foreach ($socketArr as $socket) {
             if ($socket == $this->master) {
                 $client = socket_accept($this->master);
                 if ($client < 0) {
                     $this->log("socket_accept() failed");
                     continue;
                 } else {
                     $this->connect($client);
                 }
             } else {
                 $this->log("----------New Frame Start-------");
                 $bytes = @socket_recv($socket, $buffer, 2048, 0);
                 if ($bytes == 0) {
                     $this->disconnect($socket);
                 } else {
                     $user = $this->getUserBySocket($socket);
                     if (!$user->handshake) {
                         $this->doHandShake($user, $buffer);
                     } else {
                         $this->process($user, $buffer);
                     }
                 }
             }
         }
     }
 }
示例#6
0
 public function init()
 {
     if (!($sock = socket_create(AF_INET, SOCK_STREAM, 0))) {
         $errorcode = socket_last_error();
         $errormsg = socket_strerror($errorcode);
         die("Couldn't create socket: [{$errorcode}] {$errormsg} \n");
     }
     echo "Socket created \n";
     //Connect socket to remote server
     if (!socket_connect($sock, self::ADDRESS, self::PORT)) {
         $errorcode = socket_last_error();
         $errormsg = socket_strerror($errorcode);
         die("Could not connect: [{$errorcode}] {$errormsg} \n");
     }
     echo "Connection established \n";
     $message = json_encode(['message' => 'Alright!']);
     //Send the message to the server
     if (!socket_send($sock, $message, strlen($message), 0)) {
         $errorcode = socket_last_error();
         $errormsg = socket_strerror($errorcode);
         die("Could not send data: [{$errorcode}] {$errormsg} \n");
     }
     echo "Message send successfully \n";
     //Now receive reply from server
     if (socket_recv($sock, $buf, 2045, MSG_WAITALL) === FALSE) {
         $errorcode = socket_last_error();
         $errormsg = socket_strerror($errorcode);
         die("Could not receive data: [{$errorcode}] {$errormsg} \n");
     }
     //print the received message
     socket_shutdown($sock);
     return $buf;
 }
示例#7
0
 function run()
 {
     while (true) {
         $sockets = $this->sockets;
         $write = NULL;
         $except = NULL;
         socket_select($sockets, $write, $except, NULL);
         foreach ($sockets as $sock) {
             if ($sock == $this->master) {
                 $client = socket_accept($this->master);
                 $this->sockets[] = $client;
                 $this->users[] = array('socket' => $client, 'handShake' => false);
             } else {
                 $len = socket_recv($sock, $buffer, 2048, 0);
                 $k = $this->search($sock);
                 if ($len < 7) {
                     $this->close($sock);
                     continue;
                 }
                 if (!$this->users[$k]['handShake']) {
                     $this->handShake($k, $buffer);
                 } else {
                     $buffer = $this->uncode($buffer);
                     $this->send($k, $buffer);
                 }
             }
         }
     }
 }
示例#8
0
 public function acceptClients()
 {
     foreach (Events::GetTimedEvents() as $eventIndex => $timedEvent) {
         list($callable, $interval, $lastCall) = $timedEvent;
         if ($lastCall === null) {
             Events::ResetInterval($eventIndex);
         } elseif (time() - $interval < $lastCall) {
             continue;
         } else {
             call_user_func($callable, $this);
             Events::ResetInterval($eventIndex);
         }
     }
     $sockets = array_merge(array($this->masterSocket), $this->sockets);
     $changedSockets = socket_select($sockets, $write, $except, 1);
     if ($changedSockets === 0) {
         return false;
     } else {
         if (in_array($this->masterSocket, $sockets)) {
             $clientSocket = $this->accept();
             $this->handleAccept($clientSocket);
             unset($sockets[0]);
         }
         foreach ($sockets as $socket) {
             $mixedStatus = socket_recv($socket, $buffer, 8192, 0);
             if ($mixedStatus == null) {
                 $this->handleDisconnect($socket);
                 $this->removeClient($socket);
                 continue;
             } else {
                 $this->handleReceive($socket, $buffer);
             }
         }
     }
 }
function send()
{
    if (!($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP))) {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);
        die("Couldn't create socket: [{$errorcode}] {$errormsg} \n");
    }
    echo "Socket created";
    if (!socket_connect($sock, '192.168.0.17', 9000)) {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);
        die("Could not connect: [{$errorcode}] {$errormsg} \n");
    }
    echo "Connection established \n";
    $msg = "Hello";
    //Send the message to the server
    if (!socket_send($sock, $msg, strlen($msg), 0)) {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);
        die("Could not send data: [{$errorcode}] {$errormsg} \n");
    }
    echo "Message send successfully \n";
    //Now receive reply from server
    if (socket_recv($sock, $buf, 2045, MSG_WAITALL) === FALSE) {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);
        die("Could not receive data: [{$errorcode}] {$errormsg} \n");
    }
    //print the received message
    $visual = $buf;
    socket_close($sock);
}
 protected function onSocketsAlterados($socketsRead, $socketsWrite, $socketsExcept)
 {
     // Caso socket principal foi alterado (Receptor de conexões)
     if (in_array($this->socketPrincipal, $socketsRead)) {
         $socket = socket_accept($this->socketPrincipal);
         if ($socket != null) {
             $cabecalho = socket_read($socket, 1024);
             $this->tratarSolicitacaoDeConexao($cabecalho, $socket);
         }
         // Retira socket ouvinte de lista de socketsAlterados
         $chave = array_search($this->socketPrincipal, $socketsRead);
         unset($socketsRead[$chave]);
     }
     foreach ($socketsRead as $socketRead) {
         // Verifica mensagens recebidas
         while (socket_recv($socketRead, $buffer, 1024, 0) >= 1) {
             $this->tratarRecebimentoDeMensagem($buffer, $socketRead);
             break 2;
         }
         // Verifica se cliente continua conectado
         $buffer = @socket_read($socketRead, 1024, PHP_NORMAL_READ);
         if ($buffer === false) {
             $this->tratarDesconexao($socketRead);
         }
     }
 }
示例#11
0
 /**
  * 连接到服务器
  * 接受一个浮点型数字作为超时,整数部分作为sec,小数部分*100万作为usec
  *
  * @param string $host 服务器地址
  * @param int $port 服务器地址
  * @param float $timeout 超时默认值,连接,发送,接收都使用此设置
  * @param bool $udp_connect 是否启用connect方式
  */
 function connect($host, $port, $timeout = 0.1, $udp_connect = true)
 {
     //判断超时为0或负数
     if (empty($host) or empty($port) or $timeout <= 0) {
         $this->errCode = -10001;
         $this->errMsg = "param error";
         return false;
     }
     $this->host = $host;
     $this->port = $port;
     $this->sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
     $this->set_timeout($timeout, $timeout);
     //$this->set_bufsize($this->sendbuf_size, $this->recvbuf_size);
     //是否用UDP Connect
     if ($udp_connect !== true) {
         return true;
     }
     if (socket_connect($this->sock, $host, $port)) {
         //清理connect前的buffer数据遗留
         while (@socket_recv($this->sock, $buf, 65535, MSG_DONTWAIT)) {
         }
         return true;
     } else {
         $this->set_error();
         return false;
     }
 }
示例#12
0
function sendcmd($in, $address, $service_port)
{
    /* Create a TCP/IP socket. */
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    if ($socket === false) {
        return "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
    }
    $result = socket_connect($socket, $address, $service_port);
    if ($result === false) {
        return "socket_connect() failed.\nReason: ({$result}) " . socket_strerror(socket_last_error($socket)) . "\n";
    }
    socket_write($socket, $in, strlen($in));
    $mess = "";
    /*$next = "";*/
    sleep(1);
    /*$next = socket_read($socket, 4096);*/
    while (0 != socket_recv($socket, $out, 4096, MSG_DONTWAIT)) {
        if ($out != null) {
            $mess .= $out;
        }
    }
    /*$mess .= $next;*/
    socket_close($socket);
    return $mess;
}
示例#13
0
 public function __construct($host, $port)
 {
     $this->host = $host;
     $this->port = $port;
     $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
     socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1);
     socket_bind($sock, 0, $this->port);
     socket_listen($sock);
     $clients = array($sock);
     while (true) {
         $read = $clients;
         if (socket_select($read, $write = null, $except = null, 0) < 1) {
             continue;
         }
         if (in_array($sock, $read)) {
             $clients[] = $newSocket = socket_accept($sock);
             $this->handShake($newSocket);
             socket_getpeername($newSocket, $ip);
             $this->send(array('type' => 'system', 'message' => $ip . ' Connected'), $clients);
             echo "New client connected: {$ip}\n";
             $key = array_search($sock, $read);
             unset($read[$key]);
         }
         foreach ($read as $read_sock) {
             while (socket_recv($read_sock, $buf, 1024, 0) >= 1) {
                 $msg = json_decode($this->unmask($buf), true);
                 $this->send($msg, $clients);
             }
         }
     }
     socket_close($sock);
 }
 private function mainLoop()
 {
     $changed_sockets = $this->allsockets;
     @socket_select($changed_sockets, $write = null, $exceptions = null, 0);
     foreach ($this->apps as $app) {
         $app->onTick();
     }
     foreach ($changed_sockets as $socket) {
         if ($socket == $this->master) {
             if (($rec = socket_accept($this->master)) < 0) {
                 $this->log("Error: Could not connect\n" . socket_strerror(socket_last_error($rec)));
                 continue;
             } else {
                 $this->log("New client connecting...");
                 $client = new Connection($this, $rec);
                 $this->clients[$rec] = $client;
                 $this->allsockets[] = $rec;
             }
         } else {
             $client = $this->clients[$socket];
             $bytes = @socket_recv($socket, $data, 4096, 0);
             if (!$bytes) {
                 $client->onDisconnect();
                 unset($this->clients[$socket]);
                 $index = array_search($socket, $this->allsockets);
                 unset($this->allsockets[$index]);
                 unset($client);
             } else {
                 $client->onData($data);
             }
         }
     }
 }
示例#15
0
function recv_all(&$socket, &$recv_buf)
{
    $recv_buf = "";
    $recv_number = "";
    while (true) {
        if (!@socket_recv($socket, $recv_buf, 1, 0)) {
            return false;
        }
        if ($recv_buf == ":") {
            break;
        }
        $recv_number = $recv_number . $recv_buf;
    }
    $recv_buf = "";
    $received_bytes = 0;
    $temp_recv = "";
    // receive all
    while (($received_bytes += socket_recv($socket, $temp_recv, (int) $recv_number - $received_bytes, 0)) < $recv_number) {
        $recv_buf .= $temp_recv;
        if ($received_bytes < 0) {
            return false;
        }
    }
    // append the rest
    $recv_buf .= $temp_recv;
    return true;
}
示例#16
0
 function listen()
 {
     while (true) {
         $changed = $this->sockets;
         socket_select($changed, $write = NULL, $except = NULL, NULL);
         foreach ($changed as $socket) {
             if ($socket == $this->master) {
                 $client = socket_accept($this->master);
                 if ($client < 0) {
                     $this->log("socket_accept() failed");
                     continue;
                 } else {
                     $this->connect($client);
                 }
             } else {
                 $bytes = @socket_recv($socket, $buffer, 2048, 0);
                 if ($bytes == 0) {
                     $this->disconnect($socket);
                 } else {
                     $user = $this->getuserbysocket($socket);
                     if (!$user->handshake) {
                         $this->dohandshake($user, $buffer);
                     } else {
                         $this->process($user, $this->unwrap($buffer));
                     }
                 }
             }
         }
     }
 }
示例#17
0
function negotiate($socket)
{
    socket_recv($socket, $buffer, 1024, 0);
    for ($chr = 0; $chr < strlen($buffer); $chr++) {
        if ($buffer[$chr] == chr(255)) {
            $send = isset($send) ? $send . $buffer[$chr] : $buffer[$chr];
            $chr++;
            if (in_array($buffer[$chr], array(chr(251), chr(252)))) {
                $send .= chr(254);
            }
            if (in_array($buffer[$chr], array(chr(253), chr(254)))) {
                $send .= chr(252);
            }
            $chr++;
            $send .= $buffer[$chr];
        } else {
            break;
        }
    }
    if (isset($send)) {
        socket_send($socket, $send, strlen($send), 0);
    }
    if ($chr - 1 < strlen($buffer)) {
        return substr($buffer, $chr);
    }
}
示例#18
0
 protected function handleRequest($conn)
 {
     socket_set_block($conn);
     $request = '';
     $bytes = socket_recv($conn, $request, 16384, 0);
     if ($bytes === false) {
         L::level(L::DEBUG) && L::log(L::DEBUG, __CLASS__, "Problem reading from socket: %s", array(socket_last_error($conn)));
         return;
     }
     $request = explode("\n", $request);
     $get_line = explode(' ', $request[0]);
     if (preg_match('#^/nowplaying\\.json(?:\\?.*|$)#', $get_line[1])) {
         $data = array();
         if (isset($this->most_recent_track)) {
             $track = $this->most_recent_track;
             $data = array('artist' => $track->getArtist(), 'title' => $track->getTitle(), 'album' => $track->getAlbum(), 'length' => $track->getLengthInSeconds());
         }
         $body = json_encode($data);
         $len = strlen($body);
         $lines = array('HTTP/1.0 200 OK', 'Date: ' . date('r'), 'Content-Type: application/json', 'Content-Length: ' . $len, 'Server: ScratchLive! Scrobbler', 'Connection: close', '', $body);
         socket_write($conn, implode("\n", $lines));
         socket_close($conn);
         L::level(L::DEBUG) && L::log(L::DEBUG, __CLASS__, "Finished handling request.", array());
     } else {
         $body = '<html><head><title>404 Not Found</title></head><body>No Dice.</body></html>';
         $len = strlen($body);
         $lines = array('HTTP/1.0 404 Not Found', 'Date: ' . date('r'), 'Content-Type: text/html', 'Content-Length: ' . $len, 'Server: ScratchLive! Scrobbler', 'Connection: close', '', $body);
         socket_write($conn, implode("\n", $lines));
         socket_close($conn);
         L::level(L::DEBUG) && L::log(L::DEBUG, __CLASS__, "Handled unknown request.", array());
     }
 }
示例#19
0
function coop_send($message)
{
    if (!($sock = socket_create(AF_INET, SOCK_STREAM, 0))) {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);
        die("Couldn't create socket: [{$errorcode}] {$errormsg} \n");
    }
    //Connect socket to remote server
    if (!socket_connect($sock, COOPSERVER, COOPPORT)) {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);
        die("Could not connect: [{$errorcode}] {$errormsg} \n");
    }
    //Send the message to the server
    if (!socket_send($sock, $message, strlen($message), 0)) {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);
        die("Could not send data: [{$errorcode}] {$errormsg} \n");
    }
    $buf = 'my buffer';
    if (false !== ($bytes = socket_recv($sock, $buf, 1024, 0))) {
        echo "Read {$bytes} bytes of socket_recv(). close socket ...";
    } else {
        echo "socket_recv() error; Reason: " . socket_strerror(socket_last_error($socket)) . "\n";
    }
    socket_close($sock);
    return $buf;
}
示例#20
0
 /**
  * 收Buff
  * @return bool|mixed|string
  * @throws TXException
  */
 public function revBuff()
 {
     $nCnt = @socket_recv($this->handler, $buf, 4, 0);
     if ($nCnt === false) {
         return -1;
         //timeout
     }
     if ($nCnt != 4) {
         return false;
     }
     $ret = unpack("LLen", $buf);
     $len = $ret['Len'];
     $data = '';
     $recvlen = $len;
     $i = 0;
     while ($recvlen > 0) {
         if (++$i == 100) {
             throw new TXException(4003);
         }
         $nCnt = @socket_recv($this->handler, $buf, $recvlen, 0);
         $data .= $buf;
         $recvlen -= $nCnt;
     }
     //        $data = chop($data);
     if ($result = json_decode($data, true)) {
         return $result;
     } else {
         return $data;
     }
 }
示例#21
0
 function run()
 {
     while (true) {
         $changes = $this->sockets;
         socket_select($changes, $write = NULL, $except = NULL, NULL);
         foreach ($changes as $sock) {
             if ($sock == $this->master) {
                 $client = socket_accept($this->master);
                 //$key=uniqid();
                 $this->sockets[] = $client;
                 $this->users[] = array('socket' => $client, 'shou' => false);
             } else {
                 $len = socket_recv($sock, $buffer, 2048, 0);
                 $k = $this->search($sock);
                 if ($len < 7) {
                     $name = $this->users[$k]['ming'];
                     $this->close($sock);
                     $this->send2($name, $k);
                     continue;
                 }
                 if (!$this->users[$k]['shou']) {
                     $this->woshou($k, $buffer);
                 } else {
                     $buffer = $this->uncode($buffer);
                     $this->send($k, $buffer);
                 }
             }
         }
     }
 }
示例#22
0
function readRequestFromClient($sock, $str_len)
{
    //$request = socket_read($sock, $str_len);
    $res = socket_recv($sock, &$request, $str_len, 0);
    fputs(STDOUT, $request);
    // or fwrite(STDOUT, $request);
    return $request;
}
 public function read(&$buffer, $length)
 {
     $bytesRead = socket_recv($this->socket, $buffer, $length, 0);
     if ($bytesRead === false) {
         $bytesRead = -1;
     }
     return $bytesRead;
 }
 function loop()
 {
     // начать бесконечный цикл
     while (true) {
         if ($this->loop == false) {
             break;
         }
         // добавить сокет в массив на чтение
         $read = $this->socket_array;
         /*
         	первоначально в массиве read только дескриптор главного сокета master_socket, 
         	позже, после поступления новых подключений, 
         	дескрипторы новых сокетов тоже добавляются в массив чтения read
         	и на новых сокетах тоже проверяется, было ли новое подключение
         */
         // принимает массивы сокетов и ожидает их для изменения статуса
         socket_select($read, $this->null, $this->null, 0, 10);
         // если главный сокет есть в массиве чтения,
         // значит было новое соединение
         if (in_array($this->master_socket, $read)) {
             // создание нового сокета и возврат его ресурса (дескриптора),
             // который предназначен для обмена данными с клиентом
             $new_socket = socket_accept($this->master_socket);
             // добавить новый сокет в массив сокетов
             $this->socket_array[] = $new_socket;
             // тут принимается заголовок рукопожатия от сокета
             $header = socket_read($new_socket, 1024);
             // выполнить рукопожатие
             $this->perform_handshaking($header, $new_socket, $this->host, $this->port);
             // возвращает ключ ресурса главного сокета в массиве чтения
             $found_socket = array_search($this->master_socket, $read);
             // удалить главный сокет из этого массива
             unset($read[$found_socket]);
         }
         // получение данных из всех остальных сокетов
         foreach ($read as $read_socket) {
             // пока есть полученные данные,
             // то есть полученная длина не меньше 1 байта
             while (@socket_recv($read_socket, $buf, 1024, 0) >= 1) {
                 // декодирует данные, которые получили в buf
                 $received_text = $this->data_decode($buf);
                 // отправить данные
                 $this->pre_send($received_text, $read_socket);
                 // прервать цикл foreach
                 break 2;
             }
             $buf = @socket_read($read_socket, 1024, PHP_NORMAL_READ);
             if ($buf === false) {
                 // проверка отсоединенных пользователей
                 // удалить клиента из массива сокетов
                 $this->delete_socket($read_socket);
             }
         }
     }
     // закрыть главный сокет
     socket_close($this->master_socket);
 }
示例#25
0
 function checkMessageRecieved()
 {
     foreach ($this->changed as $key => $socket) {
         $buffer = null;
         while (socket_recv($socket, $buffer, 1024, 0) >= 1) {
             unset($this->changed[$key]);
             break;
         }
     }
 }
示例#26
-1
function recvall($length, $timeout = 5)
{
    global $s;
    $endtime = time() + $timeout;
    $rdata = "";
    $remain = $length;
    while ($remain > 0) {
        $rtime = $endtime - $timeout;
        if ($rtime < 0) {
            return null;
        }
        $e = NULL;
        $r = array($s);
        @socket_select($r, $w, $e, 5);
        if (in_array($s, $r)) {
            $d = @socket_recv($s, $data, $remain, 0);
            if (false == $data) {
                return null;
            }
            $rdata .= $data;
            $remain -= strlen($data);
        }
    }
    return $rdata;
}
示例#27
-1
 public static function connect($cb)
 {
     $null = NULL;
     while (true) {
         $changed = self::$clients;
         @socket_select($changed, $null, $null, 1);
         if (in_array(self::$socket, $changed)) {
             $socket = socket_accept(self::$socket);
             self::$clients[] = $socket;
             // read data form client
             self::parseHeader(socket_read($socket, 1024));
             // setResponse socket
             self::setResponse($socket);
             socket_getpeername($socket, $ip);
             $found_socket = array_search(self::$socket, $changed);
             unset($changed[$found_socket]);
         }
         // loop all socket connection
         foreach ($changed as $client) {
             while (socket_recv($client, $buf, 2048, 0) > 0) {
                 call_user_func($cb, json_decode(self::unmask($buf), true));
                 break 2;
             }
             $buf = @socket_read($client, 1024, PHP_NORMAL_READ);
             if ($buf == false) {
                 $found_socket = array_search($client, self::$clients);
                 socket_getpeername($client, $ip);
                 unset(self::$clients[$found_socket]);
             }
         }
     }
 }
 function begin()
 {
     while (true) {
         $changed = $this->sockets;
         try {
             socket_select($changed, $write = NULL, $except = NULL, NULL);
         } catch (exception $e) {
             echo "Socket Closed";
         }
         foreach ($changed as $socket) {
             if ($socket == $this->master) {
                 $client = socket_accept($socket);
                 if ($client < 0 || $client === false) {
                     console("socket_accept() failed");
                     continue;
                 } else {
                     $this->connect($client);
                 }
             } else {
                 $bytes = @socket_recv($socket, $buffer, 2048, 0);
                 $this->console(bin2hex($buffer));
                 if ($bytes == 0) {
                     $this->disconnect($socket);
                 } else {
                     $user = $this->getuserbysocket($socket);
                     if (!$user->handshake) {
                         $this->dohandshake($user, $buffer);
                     } else {
                         $this->process($user, $buffer);
                     }
                 }
             }
         }
     }
 }
示例#29
-1
文件: Client.php 项目: juniortux/jaws
 /**
  * receive data from server
  *
  * @access  public
  * @param   int     $length     receive length
  * @param   int     $flags      socket receive flags
  * @return  mixed   received data or Jaws_Error on failure
  */
 public function recv($length, $flags = 0)
 {
     if (false === socket_recv($this->socket, $buffer, $length, $flags)) {
         return $this->close($this->socket);
     }
     return $this->decode($buffer);
 }
示例#30
-1
 /**
  * Reads a packet of data from the websocket and parses it into the following structure
  *
  * Array {
  * 		'size': The size in bytes of the data frame
  * 		'frame': A buffer containing the data received
  * 		'binary': boolean indicator true is frame is binary false if frame is utf8
  * }
  *
  * which must be returned if there is an error then the size field should be set to -1;
  */
 function read()
 {
     // Read a block of data
     $bytes = @socket_recv($this->socket, $buffer, 2048, 0);
     if ($bytes == 0) {
         throw new UnexpectedValueException('Read empty');
     }
     // Append to data read to the class buffer
     $this->buffer .= $buffer;
     $length = $this->length + strlen($buffer);
     // Now parse the frame
     while ($length > 0) {
         $lastPos = $this->bufferPos;
         $result = $this->parse($length);
         if (isset($result['done'])) {
             if ($result['done'] === false) {
                 //logToFile($this->socket . "Parser Error");
                 $out['size'] = -1;
                 $out['frame'] = "";
                 $out['binary'] = false;
                 return $out;
             } else {
                 if ($result['done'] === true) {
                     $this->length = $bytes - $this->bufferPos;
                     $this->buffer = substr($this->buffer, $this->bufferPos, $this->length);
                     $this->bufferPos = 0;
                     $length = 0;
                     // stop parsing
                 }
             }
         }
     }
     return $result;
 }