當前位置: 首頁> 最新文章列表> PHP socket_accept() 與socket_create() 的基本配合方式

PHP socket_accept() 與socket_create() 的基本配合方式

M66 2025-05-18

在PHP 網絡編程中, socket_create()socket_accept()是兩個非常重要的函數,尤其是在構建基於TCP 或UDP 的服務器端應用時。本文將詳細介紹這兩個函數的基本作用、用法,並展示它們如何配合使用,實現一個簡單的服務器端程序。

一、socket_create() 的作用與使用

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_accept()用於服務器端監聽的socket 上接受客戶端連接。它的函數原型是:

 resource socket_accept ( resource $socket )
  • 參數$socket是之前用socket_create()創建並且監聽的socket。

  • 調用後,如果有客戶端連接請求,返回一個新的socket 資源,用於與該客戶端通信;如果失敗,返回false

三、socket_create() 與socket_accept() 的配合

要讓服務器能夠監聽客戶端請求並接收連接,通常流程如下:

  1. 創建socket
    使用socket_create()創建一個socket。

  2. 綁定地址和端口<br> 使用socket_bind()將socket 綁定到本地IP 和端口

  3. 監聽socket
    使用socket_listen()監聽端口,準備接受連接。

  4. 接受連接<br> 使用socket_accept()阻塞等待客戶端連接,成功後返回新的socket

  5. 讀寫數據<br> 通過新socket 與客戶端通信

  6. 關閉連接<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 的網絡服務。