UDP 伺服器套接字

與 TCP 不同,UDP(使用者資料包協議)伺服器不是基於流的。它是基於資料包的,即客戶端以稱為資料包的單位向伺服器傳送資料,客戶端通過其地址識別客戶端。沒有內建函式關聯從同一客戶端傳送的不同資料包(與 TCP 不同,來自同一客戶端的資料由 socket_accept 建立的特定資源處理)。可以認為,每當 UDP 資料包到達時,都會接受並關閉新的 TCP 連線。

建立 UDP 伺服器套接字

$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);

將套接字繫結到地址

引數與 TCP 伺服器的引數相同。

socket_bind($socket, "0.0.0.0", 9000) or onSocketFailure("Failed to bind to 0.0.0.0:9000", $socket);

傳送資料包

該行將 UDP 包中的 $data 傳送到 $address$port

socket_sendto($socket, $data, strlen($data), 0, $address, $port);

接收資料包

以下程式碼段嘗試以客戶端索引方式管理 UDP 資料包。

$clients = [];
while (true){
    socket_recvfrom($socket, $buffer, 32768, 0, $ip, $port) === true
            or onSocketFailure("Failed to receive packet", $socket);
    $address = "$ip:$port";
    if (!isset($clients[$address])) $clients[$address] = new Client();
    $clients[$address]->handlePacket($buffer);
}

關閉伺服器

socket_close 可以在 UDP 伺服器套接字資源上使用。這將釋放 UDP 地址,允許其他程序繫結到此地址。