PHP socket_recv 未检索到多播数据
PHP socket_recv retrieves no Multicast data
我正在尝试读取 SMA EMeter 在 Windows Server 2016(PHP 版本 7.1)下发送的多播数据
// Listen to Multicast
$port = 9522 ; // Multicast Port used by SMA
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
echo "Read SMA Energymeter -> socket creation done: ".$socket."\n";
$bindip="0.0.0.0"; // local unspecified
if(!socket_bind($socket,$bindip,$port)) {echo "Read SMA Energymeter -> bind failed\n"; exit(); }
echo "Read SMA Energymeter -> bind on port: ".$port." ip: ".$bindip." done\n";
$adress = "239.12.255.254"; // Multicast IP used by SMA
$ret=socket_set_option($socket,IPPROTO_IP,MCAST_JOIN_GROUP,array("group"=>$adress,"interface"=>0));
if ($ret === false) {echo "Read SMA Energymeter -> Unable to join multicast group";exit(); }
echo "Read SMA Energymeter -> MCAST join sucessfully done: ".$adress."\n";
$fromport= 0;
$flags = 0 ;
$from = '';//"192.168.1.116" ;
$raw = "That is the return buffer";
$len = 700 ; // sind rund 600 Bytes vom SMA zu erwarten
echo "Read SMA Energymeter -> start retrieval. Len:".$len."\n";
$bytes=socket_recvfrom($socket,$raw,$len,$flags,$from,$fromport);
//$bytes=socket_recv($socket,$raw,$len,$flags);
echo "Read SMA Energymeter -> socket recieved done. Bytes:".$bytes."\n";
问题 socket_recv 从来没有 returns。看起来没有检索到数据。 Wireshark 显示每秒传入 1-2 个数据包(每个 600 字节)[1]。 Perf 监视器显示 php 正在侦听端口 9522 [2].
https://i.stack.imgur.com/jjYYa.png[1]
https://i.stack.imgur.com/4uQqt.png[2]
知道哪里出了问题吗?
问题是在 windows 下,传出 MC IF 是基于路由 table。
如果您使用多个 NIC,则需要删除 MC 路由并将其添加到您要使用的 IF 上。就像我的情况一样:
route delete 224.0.0.0 mask 240.0.0.0
route add 224.0.0.0 mask 240.0.0.0 192.168.1.63
显然其他可能需要在之前的 if 上发送 MCAST 的应用程序将不再工作:(
我正在尝试读取 SMA EMeter 在 Windows Server 2016(PHP 版本 7.1)下发送的多播数据
// Listen to Multicast
$port = 9522 ; // Multicast Port used by SMA
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
echo "Read SMA Energymeter -> socket creation done: ".$socket."\n";
$bindip="0.0.0.0"; // local unspecified
if(!socket_bind($socket,$bindip,$port)) {echo "Read SMA Energymeter -> bind failed\n"; exit(); }
echo "Read SMA Energymeter -> bind on port: ".$port." ip: ".$bindip." done\n";
$adress = "239.12.255.254"; // Multicast IP used by SMA
$ret=socket_set_option($socket,IPPROTO_IP,MCAST_JOIN_GROUP,array("group"=>$adress,"interface"=>0));
if ($ret === false) {echo "Read SMA Energymeter -> Unable to join multicast group";exit(); }
echo "Read SMA Energymeter -> MCAST join sucessfully done: ".$adress."\n";
$fromport= 0;
$flags = 0 ;
$from = '';//"192.168.1.116" ;
$raw = "That is the return buffer";
$len = 700 ; // sind rund 600 Bytes vom SMA zu erwarten
echo "Read SMA Energymeter -> start retrieval. Len:".$len."\n";
$bytes=socket_recvfrom($socket,$raw,$len,$flags,$from,$fromport);
//$bytes=socket_recv($socket,$raw,$len,$flags);
echo "Read SMA Energymeter -> socket recieved done. Bytes:".$bytes."\n";
问题 socket_recv 从来没有 returns。看起来没有检索到数据。 Wireshark 显示每秒传入 1-2 个数据包(每个 600 字节)[1]。 Perf 监视器显示 php 正在侦听端口 9522 [2].
https://i.stack.imgur.com/jjYYa.png[1]
https://i.stack.imgur.com/4uQqt.png[2]
知道哪里出了问题吗?
问题是在 windows 下,传出 MC IF 是基于路由 table。 如果您使用多个 NIC,则需要删除 MC 路由并将其添加到您要使用的 IF 上。就像我的情况一样:
route delete 224.0.0.0 mask 240.0.0.0
route add 224.0.0.0 mask 240.0.0.0 192.168.1.63
显然其他可能需要在之前的 if 上发送 MCAST 的应用程序将不再工作:(