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

      @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

                        403
                        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