Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP-Broadcast Antwort erhalten.

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • PHP-Broadcast Antwort erhalten.

    Also ich möchte mittels PHP einen Broadcast losschicken und alle antwortenden Geräte, mit deren Antworten, auflisten. Im lokalem Netzwerk in dem der Server steht gibt es Datenlogger die auf den Broadcast antworten. Das senden eines Broadcast ging ganz gut aber ich wieß nicht wie ich mit PHP die Antworten abfangen kann.
    Ich habe dazu schon einige wilde Experimente veranstaltet bin aber bisher auf keine Lösung gestoßen. Ich hoffe mir kann hier jemand helfen, hier mal der Code mitsamt meinem bisherigem Ansatz:
    PHP-Code:
    <?php  
    $broadcast_string
    ="visu oekolog\0"
    $broadcast_port="33333"
    $link=mysqli_init(); 
    mysqli_options($link,MYSQLI_OPT_CONNECT_TIMEOUT,5);     
        if(@
    mysqli_real_connect($extern_link,"p:".$_POST['address'], 'oekolog''oekolog''oekolog')){ 
            
    mysqli_query($extern_link,"CREATE TABLE IF NOT EXISTS response_list (mac VARCHAR( 17 ),ip VARCHAR( 15 ),name VARCHAR(150),type VARCHAR(150))"); 
            
    mysqli_query($extern_link,"DELETE FROM response_list WHERE 1"); 
        }     

    $sock=socket_create(AF_INETSOCK_DGRAMSOL_UDP);  
    socket_set_option($sockSOL_SOCKETSO_BROADCAST1);  
    socket_sendto($sock$broadcast_stringstrlen($broadcast_string), MSG_DONTROUTE'255.255.255.255'$broadcast_port); 
    echo (
    "broadcast send. [".$broadcast_string."] Waiting for response...\n"); 

    /*$socket=socket_create(AF_INET,SOCK_DGRAM,SOL_UDP); 
    //socket_set_option($socket,SOL_UDP,SO_REUSEADDR,1); 
    socket_bind($socket,'127.0.0.1',33333); 

    $from=""; 
    $port=0; 
    socket_recvfrom($socket,$buf,12,0,$from,$port); 
    echo "[$buf] von entfernter Adresse $from über den entfernten Port $port empfangen."; 
    socket_close($socket);*/ 
    ?>
    Nur mal so am Rande: Könnte es daran hängen das ich bei recvfrom die falsche flag gesetzt habe? Also ich hab die 0 aus C übernommen und weiß nicht welche Konstante das in C ist aber in PHP ist das MSG_WAITALL und bewirkt soweit ich das verstanden habe das die Funktion blockiert bis ich, in diesen Fall, 12 Zeichen empfangen habe was irgendwie nicht ganz das ist was ich will. Wobei sich mir da die Frage stellt ob 0 terminierte Strings auch weniger Bytes haben können.

  • #2
    Und wo sollen die Daten empfangen werden? Im Abschnitt nach dem Senden? Falls die Reihenfolge so sein sollte, erst lauschen dann senden.

    Kommentar


    • #3
      Warum auf dieser Basis? Für derlei Szenarien nimmt man in der Regel sowas wie MessageQueues. Weiter unten sind auch ein paar Beispiele aufgelistet. Gibt es einen Grund das auf IP-Basis zu machen?

      Kommentar


      • #4
        Ich möchte sozusagen eine Liste der vorhandenen Datenlogger erstellen und weiß vorher nicht wie viele das sind und hinter welcher IP sich diese verstecken. Gerade wie viele das sind und welche IP diese haben möchte ich damit in Erfahrung bringen.

        Ich möchte also von PHP aus einen Broadcast los senden, das funktioniert schon. Auf allen Loggern läuft ein kleines C Programm das auf diesen Broadcast Antwortet, das funktioniert auch schon. Anschließend sollen die Antworten in PHP gesammelt werden und genau das bekomme ich in PHP nicht hin. In C funktioniert das Konstrukt aber ich muss PHP auf der Seite des Suchenden einsetzen.

        Und nochmal um das zu verdeutlichen die Datenlogger läufen im normalfall nicht auf dem Server das sind eigene Geräte die nur Daten sammeln und diese im lokalem Netz verfügbar machen und der Server soll diese Geräte erkennen und deren IP's ermitteln.

        Kommentar


        • #5
          Nach einiger Zeit dran rum gebastle habe ich es dann doch selbst hin bekommen.
          PHP-Code:
          <?php  
              
          /*** Vars ***/ 
              /*if(isset($_POST['vars'])){ 
                  $vars=json_decode($_POST['vars']); 
                   
                  if(isset($vars->broadcast_string)){$broadcast_string=$vars->broadcast_string."\0";} 
                  else{$broadcast_string="visu oekolog\0";} 
                   
                  if(isset($vars->broadcast_port)){$broadcast_port=$vars->broadcast_port;} 
                  else{$broadcast_port="33333";} 
                   
                  if(isset($vars->broadcast_address)){$broadcast_address=$vars->broadcast_address;} 
                  else{$broadcast_address="255.255.255.255";} 
              } 
              else{ 
                  if(isset($_POST['broadcast_string'])){$broadcast_string=$_POST['broadcast_string']."\0";} 
                  else{$broadcast_string="visu oekolog\0";} 
                   
                  if(isset($_POST['broadcast_port'])){$broadcast_port=$_POST['broadcast_port'];} 
                  else{$broadcast_port="33333";} 
                   
                  if(isset($_POST['broadcast_address'])){$broadcast_address=$_POST['broadcast_address'];} 
                  else{$broadcast_address="255.255.255.255";} 
              }*/ 
              
          $broadcast_string="visu oekolog\0"
              
          $broadcast_port="33333"
              
          $broadcast_address="255.255.255.255"
              
          $time_limit=0
              
          $i=0
              
          $list=""
              
          $from=null
              
          $port=null
              
          $reply=null
               
              
          /*** Socket Setup ***/ 
              
          $sock=socket_create(AF_INET,SOCK_DGRAM,SOL_UDP);  
              
          socket_set_option($sock,SOL_SOCKET,SO_BROADCAST,1);  
              
          socket_set_option($sock,SOL_SOCKET,SO_RCVTIMEO,array("sec"=>1,"usec"=>0));//timeout for socket_recvfrom 
              /*** Send ***/ 
              
          @socket_sendto($sock,$broadcast_string,strlen($broadcast_string),MSG_DONTROUTE,$broadcast_address,$broadcast_port); 
              
          //echo ("broadcast send. [".$broadcast_string."] Waiting for response...\n<br>"); 
              /*** Recieve ***/ 
              
          $time_limit=time()+3
              while(
          time()<$time_limit){ 
                  
          $from=null
                  
          $port=null
                  
          $reply=null
                  if(@
          socket_recvfrom($sock,$reply,120,MSG_WAITALL,$from,$port)===false){ 
                  } 
                  else{ 
                  
          $list[$i]['ip']=$from
                  
          $list[$i]['response']=$reply
                  
          $i++; 
                  
          //echo("Reply : ".$reply); 
                  //echo("   From:".$from.":".$port."\n<br>"); 
                  

              } 
              
          /*** Print ***/ 
              
          echo(json_encode($list)); 

              return 
          0
          ?>
          Die Lösung sieht zwar recht simpel aus aber es hat ne gefühlte Ewigkeit gedauert darauf zu kommen.

          Kommentar

          Lädt...
          X