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 地址,允许其他进程绑定到此地址。