php实现udp通信
PHP实现UDP通信
UDP(用户数据报协议)是一种无连接的传输层协议,适用于对实时性要求高但允许少量丢包的场景。PHP可以通过socket扩展实现UDP通信。
创建UDP服务器
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($socket, '0.0.0.0', 9999);
while (true) {
socket_recvfrom($socket, $buf, 1024, 0, $remote_ip, $remote_port);
echo "Received: $buf from $remote_ip:$remote_port\n";
socket_sendto($socket, "ACK", 3, 0, $remote_ip, $remote_port);
}
创建UDP客户端
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_sendto($socket, "Hello Server", 12, 0, '127.0.0.1', 9999);
socket_recvfrom($socket, $buf, 1024, 0, $server_ip, $server_port);
echo "Received: $buf from $server_ip:$server_port\n";
关键函数说明
socket_create() 创建通信端点
- AF_INET: IPv4地址族
- SOCK_DGRAM: 数据报套接字类型(UDP)
- SOL_UDP: UDP协议
socket_bind() 将套接字绑定到地址和端口
socket_sendto() 发送数据到指定地址
socket_recvfrom() 从套接字接收数据
注意事项
UDP是无连接协议,不保证数据包的顺序和可靠性 需要自行处理数据包的分片和重组 适合小数据量传输,单个UDP包建议不超过1472字节(MTU 1500减去IP头)
错误处理
建议添加错误检查逻辑:
if (false === $socket) {
die('Socket create failed: '.socket_strerror(socket_last_error()));
}
性能优化
对于高并发场景,可以考虑使用多进程或事件驱动模型 可以设置SO_RCVBUF和SO_SNDBUF选项调整缓冲区大小







