2017-12-10 1 views
0

Ich versuche, Multicast-Daten senden von SMA EMeter unter Windows Server 2016 (PHP Version 7,1)PHP socket_recv ruft keine Multicast-Daten

// 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"; 

Problem socket_recv nie wieder zu lesen. Sieht so aus, als ob keine Daten abgerufen werden. Wireshark zeigt in jeder Sekunde 1-2 Pakete (jeweils 600Bytes) [1]. Perf Monitor zeigt an, dass php Port 9522 [2] abhört.

https://i.stack.imgur.com/jjYYa.png [1]

https://i.stack.imgur.com/4uQqt.png [2]

Jede Idee, was falsch sein könnte?

+0

die Ausgabe sieht derzeit wie lesen SMA Energymeter -> Buchse Schöpfung getan: Resource ID # 4 SMA Energymeter lesen -> bind on port: 9522 ip: 0.0.0.0 erledigt SMA Energymeter lesen -> MCAST beitreten: 239.12.255.254 SMA Energymeter lesen -> Abrufen starten Len: 700 – Endurance

+0

niemand mit eine Idee, was könnte falsch mit dem Code-Snippet sein? – Endurance

+0

Getestet ein bisschen weiter mit wireshark - sieht aus wie die w Die rong-Schnittstelle wird verwendet, da das Skript die Verbindung zum lokalen Netzwerk 192.168.0.0 (LAN) sendet, anstatt das 192.168.1.0 (WAN) -Netzwerk zu verwenden. Ich habe versucht, die Schnittstelle auf "1" zu ändern, aber LAN wird immer noch verwendet. Irgendeine Idee, wie man das unter Windows richtig einstellt? – Endurance

Antwort

0

Problem ist, dass unter Windows die ausgehende MC IF auf der Routing-Tabelle basiert. Wenn Sie mehrere NICs verwenden, müssen Sie die MC-Routen löschen und auf der IF hinzufügen, die Sie verwenden möchten. Wie in meinem Fall:

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 

offensichtlich andere Anwendungen, die die MCAST in der vorherigen senden könnte verlangen, wenn nicht mehr arbeiten :(

+0

vielleicht eleganter: Ändern Sie die Metrik der Schnittstellen, um Ihre gewünschte Multicast-Priorität zu priorisieren – Endurance