socket_shutdown

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

socket_shutdownÉteint un socket en lecture et/ou écriture

Description

socket_shutdown ( Socket $socket , int $mode = 2 ) : bool

socket_shutdown() vous permet d'empêcher les données entrantes ou sortantes ou les deux (par défaut) d'être émises via le socket socket.

Note:

Le ou les buffers associés peuvent, ou peuvent ne pas être vidés.

Liste de paramètres

socket

Une instance de Socket créée par socket_create().

mode

La valeur du paramètre mode peut être une des valeurs suivantes :

Valeurs possibles pour mode
0 Empêche la lecture du socket
1 Empêche l'écriture du socket
2 Empêche l'écriture et la lecture du socket

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version Description
8.0.0 socket est désormais une instance de Socket ; auparavant, c'était une resource.
add a note add a note

User Contributed Notes 4 notes

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