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

    (PHP 4 >= 4.1.0, PHP 5, PHP 7)

    Shuts down a socket for receiving, sending, or both

    说明

    socket_shutdown(resource $socket[,int $how= 2]): bool

    The socket_shutdown() function allows you to stop incoming, outgoing or all data(the default)from being sent through the$socket

    Note:

    The associated buffer, or buffers, may or may not be emptied.

    参数

    $socket

    A valid socket resource created with socket_create().

    $how

    The value of$howcan be one of the following:

    possible values for$how
    0 Shutdown socket reading
    1 Shutdown socket writing
    2 Shutdown socket reading and writing

    返回值

    成功时返回TRUE,或者在失败时返回FALSE

    That is not a good example of a graceful shutdown. One should close the sending side of the socket and continue to read until the remote end closes its sending connection.
    Sockets should be first shutdown and then closed.
    <?php
    // Sample: Closing sockets gracefully
    socket_shutdown($sock, 2);
    socket_close($sock);
    ?>
    
    <explain>
    In this case, the TCP client is gracefully disconnected from the server
    <?php
    define('BUF_SIZE',10);
    // create for tcp
    $sock = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp'));
    socket_bind($sock, '127.0.0.1',5200);
    socket_listen($sock,1024);
    $fp = fopen('./socket_shutdown.php','rb');
    $clnt_sock = socket_accept($sock);
    while(!feof($fp)) {
      $str = fread($fp,BUF_SIZE);
      socket_write($clnt_sock,$str,BUF_SIZE);
    } 
    $eof = "\n";
    socket_write($clnt_sock,$eof,strlen($eof));
    //disconnect output stream(断开输入流)
    socket_shutdown($clnt_sock,1);
    $ret = socket_read($clnt_sock, 100);
    printf("Message from client:%s\n",$ret);
    socket_close($clnt_sock);
    socket_close($sock);
    ?>
    <?php
    // for tcp-client 
    $clnt_sock = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp'));
    socket_connect($clnt_sock, '127.0.0.1', 5200);
    while (($cnt= @socket_read($clnt_sock, 10,PHP_NORMAL_READ)) !==false) {
      file_put_contents('./receive.data',$cnt,FILE_APPEND);
    }
    print "receive file data".PHP_EOL;
    socket_write($clnt_sock, "Tank you");
    socket_close($clnt_sock);
    ?>
    
    Shutdown and SOL_TCP:
    <?php
    $a= socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    socket_shutdown($a, 2)
    ?>
    PHP Warning: socket_shutdown(): unable to shutdown socket [107]: Transport endpoint is not connected 
    Shutdown and SOL_UDP:
    <?php
    $a= socket_create(AF_INET, SOCK_STREAM, SOL_UDP);
    socket_shutdown($a, 2)
    ?>
    PHP Warning: socket_shutdown(): unable to shutdown socket [107]: Transport endpoint is not connected 
    Conclusion: if you are not actually connected, shutdown will fails with socket_error = 107, Transport endpoint is not connected. This is true for both TPC and UDP connection (which is suprising, UDP being a connectionless protocol). This is true no matter the value set for the how parameter.