PHP Conference Japan 2024

socket_bind

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

socket_bind將名稱綁定到通訊端

說明

socket_bind(Socket $socket, 字串 $address, 整數 $port = 0): 布林值

將指定的名稱 address 綁定到由 socket 描述的通訊端。這必須在使用 socket_connect()socket_listen() 建立連線之前完成。

參數

socket

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

address

如果通訊端屬於 AF_INET 系列,則 address 是點分十進位表示法的 IP 位址(例如 127.0.0.1)。

如果通訊端屬於 AF_UNIX 系列,則 address 是 Unix 網域通訊端的檔案路徑(例如 /tmp/my.sock)。

port (選用)

port 參數僅在綁定 AF_INET 通訊端時使用,並指定要監聽連線的埠號。

返回值

成功時返回 true,失敗時返回 false

可以使用 socket_last_error() 取得錯誤碼。可以將此程式碼傳遞給 socket_strerror() 以取得錯誤的文字說明。

更新日誌

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

範例

範例 #1 使用 socket_bind() 設定來源位址

<?php
// 建立新的 socket
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

// 電腦擁有的 IP 地址範例列表
$sourceips['kevin'] = '127.0.0.1';
$sourceips['madcoder'] = '127.0.0.2';

// 綁定來源地址
socket_bind($sock, $sourceips['madcoder']);

// 連接到目標地址
socket_connect($sock, '127.0.0.1', 80);

// 寫入
$request = 'GET / HTTP/1.1' . "\r\n" .
'Host: example.com' . "\r\n\r\n";
socket_write($sock, $request);

// 關閉
socket_close($sock);

?>

注意事項

備註:

這個函式必須在呼叫 socket_connect() 之前於 socket 上使用。

另請參閱

新增註釋

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

keksov[at]gmx.de
22 年前
如果您想重複使用地址和端口,並擺脫錯誤:無法綁定,地址已使用中,您必須在呼叫 bind 之前使用 socket_setopt(請在您的 PHP 版本中檢查此函式的實際拼寫)

<?php
if (!socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1)) {
echo
socket_strerror(socket_last_error($sock));
exit;
}
?>

此解決方案是由
Christophe Dirac 發現的。感謝 Christophe!
dresende at thinkdigital dot pt
13 年前
關於先前的文章

「0」的地址與「0.0.0.0」沒有不同

127.0.0.1 -> 只接受來自本機主機
w.x.y.z(有效的本地IP)-> 只接受來自此網路
0.0.0.0 -> 接受來自任何地方
php50613160534 dot 3 dot korkman at spamgourmet dot org
19 年前
使用 0 作為端口,以便為連入連線綁定一個隨機(空閒)端口

socket_bind ($socket, $bind_address, 0);
socket_getsockname($socket, $socket_address, $socket_port);
socket_listen($socket);
...

$socket_port 包含有指派的端口,您可能需要將它發送給連線的遠端客戶端。已使用 php 5.03 測試。
ealexs at gmail dot com
2 年前
我發布這個是因為我花了幾個小時除錯這個問題。

如果您將 socket_create / socket_bind 與 Unix 網域通訊端一起使用,那麼最後使用 socket_close 並不足夠。您在第二次執行腳本時會收到「地址已在使用中」的錯誤訊息。請對用於 Unix 網域通訊端的檔案呼叫 unlink,最好在您開始建立通訊端之前。

<?php

$socket_file
= "./test.sock";

if (
file_exists($socket_file))
unlink($socket_file);
# 選擇性檔案鎖定
$socket = socket_create(AF_UNIX, SOCK_STREAM, 0);
# ... socket_set_option ...
socket_bind($socket, $socket_file);
# ...
socket_close($socket);
# 選擇性:釋放鎖定
unlink($socket_file);

?>
gasket at cekkent dot net
21 年前
前面提到的關於使用 NULL 綁定到所有地址的技巧對我來說無效,因為我會收到關於未知地址的錯誤。使用 0 對我來說有效

socket_bind ($socket, 0, $port)

這也允許您接收 UDP 廣播,這正是我一直試圖解決的問題。
gabriel at plenitech dot fr
11 年前
當使用 Unix 通訊端時,可能需要 chmod 通訊端檔案,以便授予群組和/或其他人的寫入權限。否則,只有所有者才能將資料寫入串流。

範例

<?php
$sockpath
= '/tmp/my.sock';
socket_bind($socket, $sockpath);
//這裡:僅供寫入 (socket_send) 給其他人,只有擁有者可以擷取資料。
chmod($sockpath, 0702);
?>
To Top