PHP socket_sendto发送UDP数据包丢失问题排查求助
UDP数据包发送异常排查问题
我有一套PHP CMS系统,用于向本地网络中的设备发送UDP数据包以关闭设备,代码如下:
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); if (!$sock) { echo "COULD NOT CREATE SOCKET"; } $result = socket_sendto($sock, "Ausgang1AUS", 11, 0, "192.168.20.49", 30303); socket_close($sock); if ($result) echo "UDP SENT ".$result." BYTES";
该代码在旧的物理Linux服务器上运行完全正常,但切换到新的虚拟Linux服务器后,数据包始终无法到达目标设备。PHP无报错,仅输出“UDP SENT 11 BYTES”,但数据包未出现在本地网络中。
以下场景下该操作能正常运行:
- 将UDP数据包发送到服务器自身IP;
- 在本地网络中的其他机器上运行该脚本;
- 通过netcat发送UDP,例如:
echo "Ausgang1AUS" | nc -u 192.168.20.49 30303。
服务器已禁用防火墙和SELinux,排除了通用阻塞问题。请问可能是什么原因导致的?是PHP设置或用户权限问题吗?有什么工具可以追踪UDP数据包的去向?
编辑补充:最终发现问题与PHP的socket_sendto无关,而是和发送的数据长度有关。使用echo命令会自动添加换行符,导致数据长度从11字节变成12字节,此时数据包就能正常送达。我已在SuperUser发布了新问题。
内容的提问来源于stack exchange,提问作者fseydel
相关产品推荐
相关产品推荐

