PHP Conference Japan 2024

socket_shutdown

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

socket_shutdown關閉 socket 的接收、發送或兩者

說明

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

socket_shutdown() 函式允許您停止透過 socket 發送傳入、傳出或所有資料(預設值)。

注意:

關聯的緩衝區可能會清空,也可能不會清空。

參數

socket

使用 socket_create() 建立的 Socket 實例。

mode

mode 的值可以是下列其中之一

mode 的可能值
0 關閉 socket 讀取
1 關閉 socket 寫入
2 關閉 Socket 的讀寫

回傳值

成功時回傳 true,失敗則回傳 false

更新日誌

版本 說明
8.0.0 socket 現在是一個 Socket 實例;以前它是一個 資源
新增註釋

使用者貢獻的註釋 5 則註釋

ludvig dot ericson at gmail dot com
19 年前
Socket 應該先關閉讀寫,然後再關閉連線。
<?php
// 範例:優雅地關閉 Socket
socket_shutdown($sock, 2);
socket_close($sock);
?>
匿名
2 年前
關閉讀寫是兩個端點在關閉連線之前可以執行的 formalities。這並非必要,但它可以幫助維護您的 I/O 程序,所以它很有用。

如果關閉寫入,嘗試傳送將導致 pipe 錯誤,遠端端點在接收所有其他待處理數據後將讀取到空字串。

如果關閉讀取,嘗試接收將返回空字串,如果遠端端點嘗試傳送,則會得到 pipe 錯誤。

在兩個端點之間,應該先關閉寫入。然後應該讀取和處理剩餘的數據。如果此時發送任何內容,它應該是「再見」(不需要遠端端點寫回給您的內容)。最後,可以關閉讀取。

在已關閉讀寫的通道上進行選擇將始終成功。同樣,遠端端點在選擇相反的通道時也將始終成功。
renmengyang567 at gmail dot com
5 年前
<說明>
在這種情況下,TCP 用戶端會正常地與伺服器斷開連線

<?php

define
('BUF_SIZE', 10);

// 建立 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));

// 關閉輸出串流(斷開輸出串流)
socket_shutdown($clnt_sock, 1);
$ret = socket_read($clnt_sock, 100);
printf("來自客戶端的訊息:%s\n", $ret);
socket_close($clnt_sock);
socket_close($sock);
?>

<?php
// tcp 客戶端
$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
"已接收檔案資料".PHP_EOL;
socket_write($clnt_sock, "謝謝你");
socket_close($clnt_sock);
?>
richard dot thomas at psysolutions dot com
19 年前
這並不是一個良好結束連線的範例。應該先關閉 socket 的發送端,然後繼續讀取,直到遠端關閉其發送連線。
recycling dot sp dot am at gmail dot com
14 年前
關閉連線與 SOL_TCP
<?php
$a
= socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_shutdown($a, 2)
?>
PHP 警告:socket_shutdown(): 無法關閉 socket [107]:傳輸端點未連線

關閉連線與 SOL_UDP
<?php
$a
= socket_create(AF_INET, SOCK_STREAM, SOL_UDP);
socket_shutdown($a, 2)
?>
PHP 警告:socket_shutdown(): 無法關閉 socket [107]:傳輸端點未連線

結論:如果您實際上沒有連線,關閉連線將會失敗,socket_error = 107,傳輸端點未連線。這適用於 TCP 和 UDP 連線(令人驚訝的是,UDP 是一個無連線協議)。無論 how 參數設定為何值,都是如此。
To Top