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 地址,允許其他程序繫結到此地址。