Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Host + Port auf Erreichbarkeit prüfen

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Host + Port auf Erreichbarkeit prüfen

    This topic has been deleted. Only users with topic management privileges can see it.
    • Codierknecht
      Codierknecht Developer Most Active last edited by

      Ich brauche mal wieder etwas Schützenhilfe bei JS.

      Wie kann ich am einfachsten (mit möglichst wenig Overhead) prüfen, ob ein Host über einen bestimmten Port erreichbar ist.

      function isPortReachable(host, port) {
        ???
      }
      
      Jey Cee M 2 Replies Last reply Reply Quote 0
      • Jey Cee
        Jey Cee Developer @Codierknecht last edited by

        @codierknecht net-tools adapter und dort den port in den dp portList eintragen der gescannt werden soll. Falls der Port erreichbar ist wird er in ports angezeigt.

        Codierknecht 1 Reply Last reply Reply Quote 0
        • Codierknecht
          Codierknecht Developer Most Active last edited by

          @jey-cee
          Hmmm, ich dachte an ein paar Zeilen Code. Mit axios oder was man da sonst so nimmt.
          Irgendwas in Richtung HTTP.HEAD, um einfach nur die Erreichbarkeit zu prüfen.

          mit möglichst wenig Overhead

          JS ist halt nicht so meine Welt 😉

          1 Reply Last reply Reply Quote 0
          • Codierknecht
            Codierknecht Developer Most Active @Jey Cee last edited by

            @jey-cee
            Ich sehe, Du machst das mit "evilscan".
            Vielleicht kriege ich das mit ein paar Zeilen adaptiert 😉

            1 Reply Last reply Reply Quote 0
            • Jey Cee
              Jey Cee Developer last edited by

              Wenn es nur um einen ping der ip geht ist es ganz easy: Mit exec den ping Befehl vom system Ausführen.

              Auf die idee axios dafür zu nutzen um zu prüfen ob ein bestimmter port in Benutzung ist bin ich noch gar nicht gekommen. Aber ich Denke das funktioniert nur wenn auf dem port ein webservice läuft. Mit anderen servern die zum Beispiel Sockets nutzen dürfte das nicht klappen.

              Codierknecht 1 Reply Last reply Reply Quote 0
              • M
                MCU @Codierknecht last edited by

                @codierknecht

                nc -zv host port
                
                1 Reply Last reply Reply Quote 0
                • Codierknecht
                  Codierknecht Developer Most Active @Jey Cee last edited by

                  @jey-cee sagte in Host + Port auf Erreichbarkeit prüfen:

                  ich Denke das funktioniert nur wenn auf dem port ein webservice läuft

                  Genau dazu ist das Ganze gedacht.
                  Ich hab's trotz sehr beschränkter Fähigkeiten in Sachen JS und Linux sogar hinbekommen, scheitere aber an der Asynchronität.

                  async function isPortReachable(url) {
                      const response = await axios.head(url);
                      log(response);
                      return (response.status == 200);
                  }
                  
                  

                  @MCU
                  Netcat musste ich erst nachinstallieren, aber es funktioniert.
                  Wenn man einen entsprechend kurzen Timeout mitgibt, ist das - zumindest in der Konsole - eigentlich nutzbar.
                  Jetzt müsste ich das "nur noch" in eine synchrone Funktion in JS gießen.

                  T 1 Reply Last reply Reply Quote 0
                  • T
                    ticaki Developer @Codierknecht last edited by ticaki

                    @codierknecht

                    const axios=require('axios');
                    axios.defaults.timeout = 500;
                    
                    isPortOpen('127.0.0.1', '8081'); // true or false
                    async function isPortOpen(ip,port) {
                        try {
                            await axios.get(`http://${ip}:${port}`);
                        } catch (error) {
                            if (error.code==='ECONNABORTED') {
                                return false;
                            }
                        }
                        return true;
                    }
                    

                    Wenn es nur um den offenen Port geht ist doch alles ausser Timeout ok oder? außer du gibts die ip mit ungültigen Zeichen an, dafür kenne ich den Fehlercode nicht auswendig.

                    Codierknecht 1 Reply Last reply Reply Quote 0
                    • Codierknecht
                      Codierknecht Developer Most Active @ticaki last edited by Codierknecht

                      @ticaki
                      So ähnlich habe ich es versucht.
                      Das läuft aber asynchron.
                      Das axios.get kehrt zurück, bevor am Ende das return true zurückgegeben wurde.
                      Die Funktion liefert ein promise zurück, aber kein true/false.

                      const axios=require('axios');
                      axios.defaults.timeout = 500;
                       
                      async function isPortOpen(uri) {
                          try {
                              await axios.get(uri);
                          } catch (error) {
                              log('code: ' + error.code);
                              if (error.code === 'ECONNABORTED') {
                                  log('failed');
                                  return 'closed';
                              }
                          }
                          log('success');
                          return 'open';
                      }
                      
                      log('result: ' + isPortOpen('http://192.168.178.137:8090'));
                      

                      Kann man am Log gut erkennen:

                      11:58:31.211	info	javascript.0 (1458371) Start javascript script.js.test.Test_JS
                      11:58:31.228	info	javascript.0 (1458371) script.js.test.Test_JS: result: [object Promise]
                      11:58:31.228	info	javascript.0 (1458371) script.js.test.Test_JS: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions
                      11:58:31.730	info	javascript.0 (1458371) script.js.test.Test_JS: code: ECONNABORTED
                      11:58:31.730	info	javascript.0 (1458371) script.js.test.Test_JS: failed
                      
                      11:58:38.753	info	javascript.0 (1458371) Start javascript script.js.test.Test_JS
                      11:58:38.766	info	javascript.0 (1458371) script.js.test.Test_JS: result: [object Promise]
                      11:58:38.766	info	javascript.0 (1458371) script.js.test.Test_JS: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions
                      11:58:38.782	info	javascript.0 (1458371) script.js.test.Test_JS: success
                      

                      In meiner Windows-Welt muss man schon ziemlich Klimmzüge machen, um asynchron zu arbeiten (multi-threading).
                      Da ist alles auf synchron ausgelegt.

                      Hier ist es genau andersrum. Synchrone Funktionsaufrufe scheinen echt kompliziert zu sein.

                      Aber ich hätte da eine Idee: Ich packe den von mir benötigten Aufruf der weiteren Funktionalität an das Ende dieser Funktion. Da landet man ja erst dann, wenn die Prüfung erfolgreich war.
                      Im Fehlerfall wird ja im catch abgebrochen.
                      Das würde mir auch schon ausreichen.

                      1 Reply Last reply Reply Quote 0
                      • Codierknecht
                        Codierknecht Developer Most Active last edited by

                        Ich hab's jetzt so gelöst.
                        Wenn's noch Kritikpunkte gibt - immer her damit.

                        const axios = require('axios');
                        axios.defaults.timeout = 500;
                        
                        const address = 'http://192.168.178.36:80';
                        
                        async function sendNotification(title, body) {
                            try {
                                await axios.head(address);
                            } catch (error) {
                                if (error.code === 'ECONNABORTED') {
                                    log('Target host:port not reachable');
                                    return false;
                                }
                            }
                            let url = address + '/toastMessage';
                            url += '?title=' + encodeURI(title);
                            url += '&body=' + encodeURI(body);
                            try {
                                await axios.get(url);
                            } catch (error) {
                                log(error);
                                return false;
                            }
                            return true;
                        }
                        
                        sendNotification('Titel', 'Nachricht');
                        
                        T 1 Reply Last reply Reply Quote 0
                        • T
                          ticaki Developer @Codierknecht last edited by

                          @codierknecht
                          Ups, ist für mich normal das man darauf auch awaiten muss, das ich es vergessen habe. Bei mir läuft fast immer alles in Funktionen die Funktionen aufrufen. Nur das initialisieren mache ich auf der Hauptebene.

                          Codierknecht 1 Reply Last reply Reply Quote 0
                          • Codierknecht
                            Codierknecht Developer Most Active @ticaki last edited by

                            @ticaki sagte in Host + Port auf Erreichbarkeit prüfen:

                            ist für mich normal das man darauf auch awaiten muss

                            Das ist wohl der entscheidende Unterschied zwischen Windows und Node/JS 😉

                            1 Reply Last reply Reply Quote 0
                            • First post
                              Last post

                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            741
                            Online

                            31.9k
                            Users

                            80.1k
                            Topics

                            1.3m
                            Posts

                            4
                            12
                            602
                            Loading More Posts
                            • Oldest to Newest
                            • Newest to Oldest
                            • Most Votes
                            Reply
                            • Reply as topic
                            Log in to reply
                            Community
                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                            The ioBroker Community 2014-2023
                            logo