簡體   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