在PHP 網絡編程中, socket_create()和socket_accept()是兩個非常重要的函數,尤其是在構建基於TCP 或UDP 的服務器端應用時。本文將詳細介紹這兩個函數的基本作用、用法,並展示它們如何配合使用,實現一個簡單的服務器端程序。
socket_create()用於創建一個網絡通信的socket 資源,它是網絡編程的起點。該函數原型如下:
resource socket_create ( int $domain , int $type , int $protocol )
$domain :指定協議族,常用的有AF_INET (IPv4)、 AF_INET6 (IPv6)和AF_UNIX (本地通信)。
$type :指定socket 類型,常見類型有SOCK_STREAM (TCP 流式連接)、 SOCK_DGRAM (UDP 數據報)。
$protocol :指定具體協議,通常TCP 使用SOL_TCP ,UDP 使用SOL_UDP 。
創建成功時返回一個socket 資源,失敗返回false 。
示例:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("創建 socket 失敗: " . socket_strerror(socket_last_error()));
}
socket_accept()用於服務器端監聽的socket 上接受客戶端連接。它的函數原型是:
resource socket_accept ( resource $socket )
參數$socket是之前用socket_create()創建並且監聽的socket。
調用後,如果有客戶端連接請求,返回一個新的socket 資源,用於與該客戶端通信;如果失敗,返回false 。
要讓服務器能夠監聽客戶端請求並接收連接,通常流程如下:
創建socket
使用socket_create()創建一個socket。
綁定地址和端口<br> 使用socket_bind()將socket 綁定到本地IP 和端口
監聽socket
使用socket_listen()監聽端口,準備接受連接。
接受連接<br> 使用socket_accept()阻塞等待客戶端連接,成功後返回新的socket
讀寫數據<br> 通過新socket 與客戶端通信
關閉連接<br> 通信完成後關閉socket
下面是一個完整示例,演示如何使用這兩個函數配合,實現一個簡單的TCP 服務器:
<?php
// 創建 TCP socket
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($server === false) {
die("創建 socket 失敗: " . socket_strerror(socket_last_error()));
}
// 綁定 IP 和端口
if (!socket_bind($server, "0.0.0.0", 8080)) {
die("綁定 socket 失敗: " . socket_strerror(socket_last_error($server)));
}
// 開始監聽,允許最多5個連接排隊
if (!socket_listen($server, 5)) {
die("监听失敗: " . socket_strerror(socket_last_error($server)));
}
echo "服務器已啟動,等待連接...\n";
while (true) {
// 阻塞等待客戶端連接
$client = socket_accept($server);
if ($client === false) {
echo "接收连接失敗: " . socket_strerror(socket_last_error($server)) . "\n";
continue;
}
// 讀取客戶端數據
$input = socket_read($client, 1024);
echo "收到客戶端數據: $input\n";
// 發送響應給客戶端
$response = "Hello from m66.net server!";
socket_write($client, $response, strlen($response));
// 關閉客戶端連接
socket_close($client);
}
socket_close($server);
?>
在這個例子中:
服務器綁定到本地所有IP 地址的8080 端口。
使用socket_accept()接收客戶端連接請求,成功後返回一個新的socket。
讀取客戶端發送的數據,然後返回一個簡單響應。
關閉與客戶端的連接,繼續等待新的連接。
socket_create()用於創建底層通信通道。
socket_accept()用於服務器接收客戶端連接,返回與客戶端交互的socket。
兩者配合是TCP 服務器端編程的基礎。
實際應用中還需要處理錯誤、並發連接和數據傳輸細節。
希望這篇文章能幫助你更好地理解並應用PHP 中的socket_create()和socket_accept() ,輕鬆搭建基於socket 的網絡服務。