socket_shutdown

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

socket_shutdownЗавершает работу сокета на получение и/или отправку данных

Описание

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

Функция socket_shutdown() позволяет вам остановить передачу поступающих, исходящих или всех данных (по умолчанию) через сокет socket

Замечание:

Ассоциированный буфер, или буфферы, могут быть освобождены, а могут и нет.

Список параметров

socket

Действующий ресурс сокета, созданный при помощи функции socket_create().

how

Значение параметра how может быть одним из следующих:

возможные значения для параметра how
0 Завершает чтение из сокета
1 Завершает запись в сокет
2 Завершает чтение и запись в сокет

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

add a note add a note

User Contributed Notes 4 notes

up
2
richard dot thomas at psysolutions dot com
14 years ago
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.
up
1
ludvig dot ericson at gmail dot com
14 years ago
Sockets should be first shutdown and then closed.
<?php
// Sample: Closing sockets gracefully
socket_shutdown($sock, 2);
socket_close($sock);
?>
up
0
renmengyang567 at gmail dot com
7 months ago
<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);
?>
up
-3
recycling dot sp dot am at gmail dot com
9 years ago
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.
To Top