UDP端口监听需用ss -uuln | grep :端口确认,若无输出则未成功绑定;必须将udp://127.0.0.1改为udp://0.0.0.0并完整重启,防火墙与安全组须显式放行UDP协议。

UDP端口监听状态怎么确认
Workerman UDP服务启动后,ss -tuln 或 netstat -tuln 必须看到 *:端口号 或 0.0.0.0:端口号 的 UDP 条目,否则说明内核根本没绑定成功。TCP 和 UDP 监听是独立的,不能用 telnet 测 UDP——它只支持 TCP。正确验证方式是:ss -uuln | grep :你的端口(注意是 -uuln,不是 -tuln)。如果无输出,90% 是 Worker 实例没起来,或 listen() 参数写错协议。
UDP监听地址写成127.0.0.1会怎样
UDP 比 TCP 更“安静”:监听 127.0.0.1:5678 时,外部设备发包过去,Linux 内核直接丢弃,不回 ICMP,客户端收不到任何响应,表现为“完全静默失败”。常见错误写法:new Worker('udp://127.0.0.1:5678')。必须改成:new Worker('udp://0.0.0.0:5678') 或 new Worker('udp://*:5678')。改完务必完整重启:php start.php stop && php start.php start,reload 不会重绑 UDP socket。
UDP连接失败时防火墙和安全组要注意什么
UDP 流量更容易被拦截,且错误表现更隐蔽:
- 云厂商安全组默认只放行 TCP 规则,UDP 需单独添加——协议类型必须选
UDP,不是ALL或留空 - Linux 系统防火墙(如 firewalld)对 UDP 的限制更严格:
sudo firewall-cmd --add-port=5678/udp --permanent && sudo firewall-cmd --reload - Docker 容器跑 UDP 服务时,
-p 5678:5678/udp必须显式加/udp后缀,否则只映射 TCP - Windows/macOS 宿主机防火墙对 UDP 入站默认全拒,临时测试建议直接关闭或添加入站规则
UDP数据收不到的常见代码陷阱
UDP 是无连接协议,Workerman 不会触发 onConnect 或 onClose,只走 onMessage。收不到数据时先排除这些:
-
onMessage回调里用了echo或var_dump却没开日志——UDP 没响应体,输出不会返回给客户端,只能靠file_put_contents写日志验证是否进回调 - 客户端发的是广播包(如
255.255.255.255),但 Workerman 默认不接收广播,需在onWorkerStart中手动设置 socket 选项:socket_set_option($socket, SOL_SOCKET, SO_BROADCAST, 1) - UDP 包大小超限(默认 Linux 为 65507 字节),若客户端发 >64KB 的包,内核直接截断或丢弃,
onMessage收到的是残缺数据 - 多个 Worker 进程监听同一 UDP 端口时,未启用
reusePort,导致部分包被随机丢弃——需在实例化后加:$worker->reusePort = true;
ss -uuln)、防火墙是否放行(/udp 显式规则)、代码是否真进回调(写文件日志而非 echo)。最容易被忽略的是:改了监听地址却只 reload,旧 UDP socket 仍占着端口,新进程 bind 失败却不报错。

















