• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • stream_socket_accept()

    (PHP 5, PHP 7)

    接受由stream_socket_server()创建的套接字连接

    说明

    stream_socket_accept(resource $server_socket[,float $timeout= ini_get("default_socket_timeout")[,string &$peername]]): resource

    接受由stream_socket_server()创建的套接字连接。

    参数

    $server_socket

    需要接受的服务器创建的套接字连接。

    $timeout

    覆盖默认的套接字接受的超时时限。输入的时间需以秒为单位。

    $peername

    如果包含该参数并且是可以从选中的传输数据中获取到,则将被设置给连接中的客户端主机的名称(地址)(怕出入很大,附带上原文:Will be set to the name (address) of the client which connected, if included and available from the selected transport.)

    Note:

    也可以之后通过stream_socket_get_name()来确定。

    返回值

    返回接受套接之后的资源流或者在失败时返回FALSE

    注释

    Warning

    该函数不能被用于 UDP 套接字。可以使用stream_socket_recvfrom()和stream_socket_sendto()来取而代之。

    参见

    This code could be very helpfull...
    The following code is for the "server". It listen for a message until CTRL-C
    <?php
    while (true)
    {
    // disconnected every 5 seconds...
    receive_message('127.0.0.1','85',5);
    }
    function receive_message($ipServer,$portNumber,$nbSecondsIdle)
    {
     // creating the socket...
     $socket = stream_socket_server('tcp://'.$ipServer.':'.$portNumber, $errno, $errstr);
     if (!$socket)
     {
      echo "$errstr ($errno)<br />\n";
     }
     else
      {
      // while there is connection, i'll receive it... if I didn't receive a message within $nbSecondsIdle seconds, the following function will stop.
      while ($conn = @stream_socket_accept($socket,$nbSecondsIdle))
      {
       $message= fread($conn, 1024);
       echo 'I have received that : '.$message;
       fputs ($conn, "OK\n");
       fclose ($conn);
      }
      fclose($socket);
     }
    }
    ?>
    The following code is for the "client". It send a message, and read the respons...
    <?php
    send_message('127.0.0.1','85','Message to send...');
    function send_message($ipServer,$portServer,$message)
    {
     $fp = stream_socket_client("tcp://$ipServer:$portServer", $errno, $errstr);
     if (!$fp)
     {
       echo "ERREUR : $errno - $errstr<br />\n";
     }
     else
     {
       fwrite($fp,"$message\n");
       $response = fread($fp, 4);
       if ($response != "OK\n")
        {echo 'The command couldn\'t be executed...\ncause :'.$response;}
       else
        {echo 'Execution successfull...';}
       fclose($fp);
     }
    }
    ?>
    
    To check if there's a new connection waiting, without blocking, or (when using non-blocking mode) without notices), you can use stream_accept (as opposed to socket_select).
    <?php
      class GenericClass {
        protected $resSocket=null;
        function acceptConnections() {
          # check that we still have a resource 
          
          if(is_resource($this->resSocket)) {
          
            $arrRead=array($this->resSocket);
            
            $arrWrite=array();
            
            /** @warning Passing $arrRead,$arrWrite by reference */
            if(stream_select($arrRead,$arrWrite,$arrWrite,0)) {
          
              $resConnection=stream_socket_accept($this->resSocket,0);
              # ... other stuff here
            }
          }
        }
      }
    ?>
    
    this function, compared to the function socket_accept, got an extra argument "timeout".
    To make this function wait indefinitelly to incoming connections, just as in socket_accept, set timeout to -1. It works for me with PHP 5.0.4.
    Note that if you use 0 as timeout, the connection will timeout right away.
    To whom it may concern, and it may concern you greatly, stream_set_blocking has no effect on stream_socket_accept.
    If you want it to return right away, connection or not, use 0 for the timeout parameter.