PHP Conference Japan 2024

socket_create_listen

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

socket_create_listen在指定連接埠開啟通訊埠以接受連線

說明

socket_create_listen(int $port, int $backlog = SOMAXCONN): Socket|false

socket_create_listen() 會建立一個新的 Socket 實例,類型為 AF_INET,監聽給定端口上*所有*本地接口,等待新的連線。

此函數旨在簡化建立僅監聽接受新連線的 socket 的任務。

參數

port(端口)

所有接口上要監聽的端口。

backlog(待辦事項數量)

backlog 參數定義了待處理連線隊列可能增長的最大長度。可以將 SOMAXCONN 作為 backlog 參數傳遞,有關更多資訊,請參閱 socket_listen()

傳回值

socket_create_listen() 成功時傳回一個新的 Socket 實例,失敗時傳回 false。可以使用 socket_last_error() 擷取錯誤碼。可以將此程式碼傳遞給 socket_strerror() 以取得錯誤的文字說明。

更新日誌

版本 說明
8.4.0 現在預設值為 SOMAXCONN。之前是 128
8.0.0 成功時,此函數現在傳回一個 Socket 實例;之前傳回的是 資源

注意事項

注意:

如果您想建立一個只監聽特定接口的 socket,您需要使用 socket_create()socket_bind()socket_listen()

參見

新增註解

使用者貢獻的註解 3 則註解

jdittmer at ppp0 dot net
20 年前
如果您未指定端口號或指定為 0,則會選擇一個隨機的可用端口。
若要在同一台機器上的用戶端/伺服器之間使用端口進行 ipc,您可以使用(減去錯誤檢查)

server.php
<?php
$sock
= socket_create_listen(0);
socket_getsockname($sock, $addr, $port);
print
"伺服器監聽於 $addr:$port\n";
$fp = fopen($port_file, 'w');
fwrite($fp, $port);
fclose($fp);
while(
$c = socket_accept($sock)) {
/* 執行一些有用的操作 */
socket_getpeername($c, $raddr, $rport);
print
"收到來自 $raddr:$rport 的連線\n";
}
socket_close($sock);
?>

client.php (客戶端程式)
<?php
$fp
= fopen($port_file, 'r');
$port = fgets($fp, 1024);
fclose($fp);
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($sock, '127.0.0.1', $port);
socket_close($sock);
?>
sysspoof at ng-lab dot org
16 年前
請注意,在 Linux 和 BSD 系統上,1 到 1024 的連接埠需要 root 權限。因此,建議為您自己的應用程式選擇更高的連接埠。
basim at baassiri dot com
20 年前
請記住,連接埠的有效範圍是 1 - 65535。

[編者註:已修正 typo,感謝 abryant at apple dot com]
To Top