PHP Conference Japan 2024

socket_getpeername

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

socket_getpeername查詢指定 socket 的遠端資訊

說明

socket_getpeername(Socket $socket, string &$address, int &$port = null): bool

查詢指定 socket 的遠端資訊,根據 socket 的類型,結果可能為主機/埠或 Unix 檔案系統路徑。

參數

socket

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

address

如果指定的 socket 類型為 AF_INETAF_INET6socket_getpeername() 會將對端(遠端)的 *IP 地址* 以適當的表示法(例如 127.0.0.1fe80::1)返回到 address 參數中,並且如果提供了可選的 port 參數,也會返回關聯的連接埠。

如果指定的 socket 類型為 AF_UNIXsocket_getpeername() 會將 Unix 檔案系統路徑(例如 /var/run/daemon.sock)返回到 address 參數中。

port(連接埠)

如果提供此參數,它將儲存與 address 相關聯的連接埠。

返回值

成功時返回 true,失敗時返回 falsesocket_getpeername() 也可能在 socket 類型不是 AF_INETAF_INET6AF_UNIX 的任何一種時返回 false,在這種情況下,最後一個 socket 錯誤碼*不會*被更新。

更新日誌

版本 說明
8.0.0 socket 現在是 Socket 的實例;以前,它是 資源

注意事項

注意:

socket_getpeername() 不應與使用 socket_accept() 建立的 AF_UNIX sockets 一起使用。只有使用 socket_connect() 建立的 sockets 或在呼叫 socket_bind() 之後的主要伺服器 socket 才會返回有意義的值。

注意:

要讓 socket_getpeername() 返回有意義的值,套用它的 socket 當然必須是具有「對端」概念的 socket。

參見

新增註釋

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

redph0enix at hotmail dot com
21 年前
`socket_getpeername` 無法用於 UDP 通訊端。請改用 `socket_recvfrom` - 它會提供來源伺服器的 IP 位址和連接埠 - 例如:

$size = socket_recvfrom($socket, $input, 65535, 0, $ipaddress, $port);
echo "從 IP $ipaddress 連接埠 $port 收到 [$input] ($size 位元組)\n";
匿名使用者
8 年前
無法用於 UDP 的原因是 UDP 是無狀態的;邏輯上除了在傳送或接收封包時之外,沒有對等點。或者更嚴格地說,一個 UDP 通訊端可以與 0..N 個對等點互動。
To Top