略微加速

PHP官方手册 - 互联网笔记

PHP - Manual: socket_shutdown

2024-11-14

socket_shutdown

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

socket_shutdownShuts down a socket for receiving, sending, or both

说明

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

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

注意:

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

参数

socket

A Socket instance created with socket_create().

mode

The value of mode can be one of the following:

possible values for mode
0 Shutdown socket reading
1 Shutdown socket writing
2 Shutdown socket reading and writing

返回值

成功时返回 true, 或者在失败时返回 false

更新日志

版本 说明
8.0.0 现在 socketSocket 实例, 之前是 resource
add a noteadd a note

User Contributed Notes 4 notes

up
3
ludvig dot ericson at gmail dot com
16 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
16 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
3 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
11 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.

官方地址:https://www.php.net/manual/en/function.socket-shutdown.php

北京半月雨文化科技有限公司.版权所有 京ICP备12026184号-3