繁体   English   中英

丢失 UDP 封装与 PHP socket_sendto

[英]Lost UDP packages with PHP socket_sendto

我有一个 PHP CMS 系统,它正在发送 UDP package 以关闭本地网络上的设备。

$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 echo "Ausgang1AUS" | nc -u 192.168.20.49 30303 所以它不应该是一个普遍的阻塞问题。

防火墙和 SELinux 在机器上都被禁用。

有谁知道发生了什么? 可能是一些 PHP 设置或一些用户权限? 有什么工具可以用来找出 UDP package 发生了什么?

我现在很迷茫...

编辑:似乎与 php socket_sendto 最终无关,而是连接到发送数据的 LENGTH。 所以@stark 是对的,使用 echo (因此引入了换行符)将长度从 11 个字节更改为 12 个字节,突然包裹确实到达了。

我在SuperUser上发布了一个新问题

此虚拟 Linux 服务器是否在 Windows VM 上运行? 最近的 Windows 更新在管理程序中引入了一个错误,该错误导致 12 字节以下的 UDP 数据包无法通过校验和验证。

这里有一个 Github 问题,其他用户在 WSL2 上报告了同样的问题。

https://github.com/microsoft/WSL/issues/8610

您可以看到该线程中发布的解决方法可能对您的情况有所帮助,至少在 Microsoft 设法解决该问题之前:
ethtool -K eth0 tx off

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM