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.
(PHP 4 >= 4.1.0, PHP 5, PHP 7)
socket_shutdown — Cierra un socket para dejar de recibir, enviar, o ambos
$socket
[, int $how
= 2
] )
La función socket_shutdown() permite detener
la entrada y salida de toda la información (lo predeterminado) que está siendo enviada a través del
socket
Nota:
El búfer o búferes podrían o no estar vaciados.
socket
Un recurso socket válido creado con socket_create().
how
El valor de how
puede ser uno de los siguientes:
0 | Cierra el socket para dejar de leer |
1 | Cierra el socket para dejar de escribir |
2 | Cierra el socket para dejar de leer y escribir |
Devuelve TRUE
en caso de éxito o FALSE
en caso de error.
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);
?>
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.