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.
    • 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

                          476
                          Online

                          31.8k
                          Users

                          80.0k
                          Topics

                          1.3m
                          Posts

                          4
                          12
                          589
                          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