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