Looping a perpetual UDP packet ping in Node.js (3s interval)












0














I am trying to build a loop that my server will run, pinging an arduino which will return data when it receives a packet from my IP. I already have the mongoDB collection working for the data and am just stuck at this point where I would like my server to begin pinging the arduino every few seconds from start up.



Note: this is really my first crack at really understanding async JS and is likely just a noob mistake.



Code:



const dgram = require('dgram');
const message = Buffer.from('Some bytes');
const clientPing = dgram.createSocket('udp4');

const pinging = true;

function ping() {

return new Promise ((resolve, reject) => {

// This chunk
clientPing.send("Hi Uno", 8888, 'xxx.xx.xx.xxx', (err) => {
clientPing.close();
});
// When run on it's own successfully pings the arduino

const error = false;

if(error == true) {
reject('Error');
} else {
resolve('Pinged');
}

});

}

//Working ping
ping().then().catch(err => console.log(err));


All of this above was meant to act as just a simple proof that the promise does work and successfully emits a udp packet to the target.



function loop() {
while(pinging == true) {
setTimeout(() => {
ping().then().catch(err => console.log(err));
console.log('Pinged');
}, 3000);
}
}


The rest of these are just different combinations of how I've tried to solve the problem here. As far as I can tell I don't have a memory leak as the loop runs just fine without increasing resource consumption.



function loop() {
console.log("entered loop")
while(pinging == true) {
setTimeout(() => {
clientPing.send("Hi Uno", 8888, 'xxx.xx.xx.xxx', (err) => {
clientPing.close();
});
console.log('Pinged');
}, 3000);
}
}


This one was intended to run just the code for the ping without using the promise but still doesn't yield the desired result. The console.log is printed above but it doesn't seem to ever trigger the timeout.



loop();


This just runs one of the two loop() functions.



do {
setTimeout(() => {
ping().then().catch(err => console.log(err));
console.log("pinged");
}, 2000)
} while(pinging == true)


Lastly I thought I'd try do but also without success.



If all of these are pasted into a document sequentially it builds my file. Simply uncomment/comment out each section as needed.



Am I just missing something obvious or is there something fairly complex here that's stopping this from working?



Thanks!










share|improve this question



























    0














    I am trying to build a loop that my server will run, pinging an arduino which will return data when it receives a packet from my IP. I already have the mongoDB collection working for the data and am just stuck at this point where I would like my server to begin pinging the arduino every few seconds from start up.



    Note: this is really my first crack at really understanding async JS and is likely just a noob mistake.



    Code:



    const dgram = require('dgram');
    const message = Buffer.from('Some bytes');
    const clientPing = dgram.createSocket('udp4');

    const pinging = true;

    function ping() {

    return new Promise ((resolve, reject) => {

    // This chunk
    clientPing.send("Hi Uno", 8888, 'xxx.xx.xx.xxx', (err) => {
    clientPing.close();
    });
    // When run on it's own successfully pings the arduino

    const error = false;

    if(error == true) {
    reject('Error');
    } else {
    resolve('Pinged');
    }

    });

    }

    //Working ping
    ping().then().catch(err => console.log(err));


    All of this above was meant to act as just a simple proof that the promise does work and successfully emits a udp packet to the target.



    function loop() {
    while(pinging == true) {
    setTimeout(() => {
    ping().then().catch(err => console.log(err));
    console.log('Pinged');
    }, 3000);
    }
    }


    The rest of these are just different combinations of how I've tried to solve the problem here. As far as I can tell I don't have a memory leak as the loop runs just fine without increasing resource consumption.



    function loop() {
    console.log("entered loop")
    while(pinging == true) {
    setTimeout(() => {
    clientPing.send("Hi Uno", 8888, 'xxx.xx.xx.xxx', (err) => {
    clientPing.close();
    });
    console.log('Pinged');
    }, 3000);
    }
    }


    This one was intended to run just the code for the ping without using the promise but still doesn't yield the desired result. The console.log is printed above but it doesn't seem to ever trigger the timeout.



    loop();


    This just runs one of the two loop() functions.



    do {
    setTimeout(() => {
    ping().then().catch(err => console.log(err));
    console.log("pinged");
    }, 2000)
    } while(pinging == true)


    Lastly I thought I'd try do but also without success.



    If all of these are pasted into a document sequentially it builds my file. Simply uncomment/comment out each section as needed.



    Am I just missing something obvious or is there something fairly complex here that's stopping this from working?



    Thanks!










    share|improve this question

























      0












      0








      0







      I am trying to build a loop that my server will run, pinging an arduino which will return data when it receives a packet from my IP. I already have the mongoDB collection working for the data and am just stuck at this point where I would like my server to begin pinging the arduino every few seconds from start up.



      Note: this is really my first crack at really understanding async JS and is likely just a noob mistake.



      Code:



      const dgram = require('dgram');
      const message = Buffer.from('Some bytes');
      const clientPing = dgram.createSocket('udp4');

      const pinging = true;

      function ping() {

      return new Promise ((resolve, reject) => {

      // This chunk
      clientPing.send("Hi Uno", 8888, 'xxx.xx.xx.xxx', (err) => {
      clientPing.close();
      });
      // When run on it's own successfully pings the arduino

      const error = false;

      if(error == true) {
      reject('Error');
      } else {
      resolve('Pinged');
      }

      });

      }

      //Working ping
      ping().then().catch(err => console.log(err));


      All of this above was meant to act as just a simple proof that the promise does work and successfully emits a udp packet to the target.



      function loop() {
      while(pinging == true) {
      setTimeout(() => {
      ping().then().catch(err => console.log(err));
      console.log('Pinged');
      }, 3000);
      }
      }


      The rest of these are just different combinations of how I've tried to solve the problem here. As far as I can tell I don't have a memory leak as the loop runs just fine without increasing resource consumption.



      function loop() {
      console.log("entered loop")
      while(pinging == true) {
      setTimeout(() => {
      clientPing.send("Hi Uno", 8888, 'xxx.xx.xx.xxx', (err) => {
      clientPing.close();
      });
      console.log('Pinged');
      }, 3000);
      }
      }


      This one was intended to run just the code for the ping without using the promise but still doesn't yield the desired result. The console.log is printed above but it doesn't seem to ever trigger the timeout.



      loop();


      This just runs one of the two loop() functions.



      do {
      setTimeout(() => {
      ping().then().catch(err => console.log(err));
      console.log("pinged");
      }, 2000)
      } while(pinging == true)


      Lastly I thought I'd try do but also without success.



      If all of these are pasted into a document sequentially it builds my file. Simply uncomment/comment out each section as needed.



      Am I just missing something obvious or is there something fairly complex here that's stopping this from working?



      Thanks!










      share|improve this question













      I am trying to build a loop that my server will run, pinging an arduino which will return data when it receives a packet from my IP. I already have the mongoDB collection working for the data and am just stuck at this point where I would like my server to begin pinging the arduino every few seconds from start up.



      Note: this is really my first crack at really understanding async JS and is likely just a noob mistake.



      Code:



      const dgram = require('dgram');
      const message = Buffer.from('Some bytes');
      const clientPing = dgram.createSocket('udp4');

      const pinging = true;

      function ping() {

      return new Promise ((resolve, reject) => {

      // This chunk
      clientPing.send("Hi Uno", 8888, 'xxx.xx.xx.xxx', (err) => {
      clientPing.close();
      });
      // When run on it's own successfully pings the arduino

      const error = false;

      if(error == true) {
      reject('Error');
      } else {
      resolve('Pinged');
      }

      });

      }

      //Working ping
      ping().then().catch(err => console.log(err));


      All of this above was meant to act as just a simple proof that the promise does work and successfully emits a udp packet to the target.



      function loop() {
      while(pinging == true) {
      setTimeout(() => {
      ping().then().catch(err => console.log(err));
      console.log('Pinged');
      }, 3000);
      }
      }


      The rest of these are just different combinations of how I've tried to solve the problem here. As far as I can tell I don't have a memory leak as the loop runs just fine without increasing resource consumption.



      function loop() {
      console.log("entered loop")
      while(pinging == true) {
      setTimeout(() => {
      clientPing.send("Hi Uno", 8888, 'xxx.xx.xx.xxx', (err) => {
      clientPing.close();
      });
      console.log('Pinged');
      }, 3000);
      }
      }


      This one was intended to run just the code for the ping without using the promise but still doesn't yield the desired result. The console.log is printed above but it doesn't seem to ever trigger the timeout.



      loop();


      This just runs one of the two loop() functions.



      do {
      setTimeout(() => {
      ping().then().catch(err => console.log(err));
      console.log("pinged");
      }, 2000)
      } while(pinging == true)


      Lastly I thought I'd try do but also without success.



      If all of these are pasted into a document sequentially it builds my file. Simply uncomment/comment out each section as needed.



      Am I just missing something obvious or is there something fairly complex here that's stopping this from working?



      Thanks!







      node.js loops udp






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 21 '18 at 5:23









      EruEru

      264




      264
























          1 Answer
          1






          active

          oldest

          votes


















          0














          Your ping function is written incorrectly. It is resolving promise just after sending ping not on callback of it. Please change it like this.



          function ping() {
          return new Promise ((resolve, reject) => {

          // This chunk
          clientPing.send("Hi Uno", 8888, 'xxx.xx.xx.xxx', (err) => {
          const error = false;

          clientPing.close();

          if(error == true) {
          reject('Error');
          } else {
          resolve('Pinged');
          }

          });
          });

          }


          And for looping if you shouldn't do sync loop it won't wait until setTimeout finished or your function has finished executing.



          For async looping you can loop it by async await
          for example:



          function wait () {
          return new Promise((resolve, reject)=> {
          setTimeout(() => {
          resolve()
          }, 3000)
          })
          }

          for (let i = 0; i<n; i++) {
          await ping();
          await wait();
          }





          share|improve this answer





















          • This seems to return an error SyntaxError: await is only valid in async function?
            – Eru
            Nov 22 '18 at 1:40










          • I tried running it like this but it no longer seemed to loop async function pingLoop(){ for (let i = 0; i>n; i++) { await ping(); await wait(); } } pingLoop();
            – Eru
            Nov 22 '18 at 1:51












          • Well it might be because error occured and rejected the promise. Try to add error handler to function. Here is working example jsfiddle.net/jmzp5c9t
            – Delgee B
            Nov 22 '18 at 10:27













          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53405702%2flooping-a-perpetual-udp-packet-ping-in-node-js-3s-interval%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          0














          Your ping function is written incorrectly. It is resolving promise just after sending ping not on callback of it. Please change it like this.



          function ping() {
          return new Promise ((resolve, reject) => {

          // This chunk
          clientPing.send("Hi Uno", 8888, 'xxx.xx.xx.xxx', (err) => {
          const error = false;

          clientPing.close();

          if(error == true) {
          reject('Error');
          } else {
          resolve('Pinged');
          }

          });
          });

          }


          And for looping if you shouldn't do sync loop it won't wait until setTimeout finished or your function has finished executing.



          For async looping you can loop it by async await
          for example:



          function wait () {
          return new Promise((resolve, reject)=> {
          setTimeout(() => {
          resolve()
          }, 3000)
          })
          }

          for (let i = 0; i<n; i++) {
          await ping();
          await wait();
          }





          share|improve this answer





















          • This seems to return an error SyntaxError: await is only valid in async function?
            – Eru
            Nov 22 '18 at 1:40










          • I tried running it like this but it no longer seemed to loop async function pingLoop(){ for (let i = 0; i>n; i++) { await ping(); await wait(); } } pingLoop();
            – Eru
            Nov 22 '18 at 1:51












          • Well it might be because error occured and rejected the promise. Try to add error handler to function. Here is working example jsfiddle.net/jmzp5c9t
            – Delgee B
            Nov 22 '18 at 10:27


















          0














          Your ping function is written incorrectly. It is resolving promise just after sending ping not on callback of it. Please change it like this.



          function ping() {
          return new Promise ((resolve, reject) => {

          // This chunk
          clientPing.send("Hi Uno", 8888, 'xxx.xx.xx.xxx', (err) => {
          const error = false;

          clientPing.close();

          if(error == true) {
          reject('Error');
          } else {
          resolve('Pinged');
          }

          });
          });

          }


          And for looping if you shouldn't do sync loop it won't wait until setTimeout finished or your function has finished executing.



          For async looping you can loop it by async await
          for example:



          function wait () {
          return new Promise((resolve, reject)=> {
          setTimeout(() => {
          resolve()
          }, 3000)
          })
          }

          for (let i = 0; i<n; i++) {
          await ping();
          await wait();
          }





          share|improve this answer





















          • This seems to return an error SyntaxError: await is only valid in async function?
            – Eru
            Nov 22 '18 at 1:40










          • I tried running it like this but it no longer seemed to loop async function pingLoop(){ for (let i = 0; i>n; i++) { await ping(); await wait(); } } pingLoop();
            – Eru
            Nov 22 '18 at 1:51












          • Well it might be because error occured and rejected the promise. Try to add error handler to function. Here is working example jsfiddle.net/jmzp5c9t
            – Delgee B
            Nov 22 '18 at 10:27
















          0












          0








          0






          Your ping function is written incorrectly. It is resolving promise just after sending ping not on callback of it. Please change it like this.



          function ping() {
          return new Promise ((resolve, reject) => {

          // This chunk
          clientPing.send("Hi Uno", 8888, 'xxx.xx.xx.xxx', (err) => {
          const error = false;

          clientPing.close();

          if(error == true) {
          reject('Error');
          } else {
          resolve('Pinged');
          }

          });
          });

          }


          And for looping if you shouldn't do sync loop it won't wait until setTimeout finished or your function has finished executing.



          For async looping you can loop it by async await
          for example:



          function wait () {
          return new Promise((resolve, reject)=> {
          setTimeout(() => {
          resolve()
          }, 3000)
          })
          }

          for (let i = 0; i<n; i++) {
          await ping();
          await wait();
          }





          share|improve this answer












          Your ping function is written incorrectly. It is resolving promise just after sending ping not on callback of it. Please change it like this.



          function ping() {
          return new Promise ((resolve, reject) => {

          // This chunk
          clientPing.send("Hi Uno", 8888, 'xxx.xx.xx.xxx', (err) => {
          const error = false;

          clientPing.close();

          if(error == true) {
          reject('Error');
          } else {
          resolve('Pinged');
          }

          });
          });

          }


          And for looping if you shouldn't do sync loop it won't wait until setTimeout finished or your function has finished executing.



          For async looping you can loop it by async await
          for example:



          function wait () {
          return new Promise((resolve, reject)=> {
          setTimeout(() => {
          resolve()
          }, 3000)
          })
          }

          for (let i = 0; i<n; i++) {
          await ping();
          await wait();
          }






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 21 '18 at 8:04









          Delgee BDelgee B

          665




          665












          • This seems to return an error SyntaxError: await is only valid in async function?
            – Eru
            Nov 22 '18 at 1:40










          • I tried running it like this but it no longer seemed to loop async function pingLoop(){ for (let i = 0; i>n; i++) { await ping(); await wait(); } } pingLoop();
            – Eru
            Nov 22 '18 at 1:51












          • Well it might be because error occured and rejected the promise. Try to add error handler to function. Here is working example jsfiddle.net/jmzp5c9t
            – Delgee B
            Nov 22 '18 at 10:27




















          • This seems to return an error SyntaxError: await is only valid in async function?
            – Eru
            Nov 22 '18 at 1:40










          • I tried running it like this but it no longer seemed to loop async function pingLoop(){ for (let i = 0; i>n; i++) { await ping(); await wait(); } } pingLoop();
            – Eru
            Nov 22 '18 at 1:51












          • Well it might be because error occured and rejected the promise. Try to add error handler to function. Here is working example jsfiddle.net/jmzp5c9t
            – Delgee B
            Nov 22 '18 at 10:27


















          This seems to return an error SyntaxError: await is only valid in async function?
          – Eru
          Nov 22 '18 at 1:40




          This seems to return an error SyntaxError: await is only valid in async function?
          – Eru
          Nov 22 '18 at 1:40












          I tried running it like this but it no longer seemed to loop async function pingLoop(){ for (let i = 0; i>n; i++) { await ping(); await wait(); } } pingLoop();
          – Eru
          Nov 22 '18 at 1:51






          I tried running it like this but it no longer seemed to loop async function pingLoop(){ for (let i = 0; i>n; i++) { await ping(); await wait(); } } pingLoop();
          – Eru
          Nov 22 '18 at 1:51














          Well it might be because error occured and rejected the promise. Try to add error handler to function. Here is working example jsfiddle.net/jmzp5c9t
          – Delgee B
          Nov 22 '18 at 10:27






          Well it might be because error occured and rejected the promise. Try to add error handler to function. Here is working example jsfiddle.net/jmzp5c9t
          – Delgee B
          Nov 22 '18 at 10:27




















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.





          Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


          Please pay close attention to the following guidance:


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53405702%2flooping-a-perpetual-udp-packet-ping-in-node-js-3s-interval%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Create new schema in PostgreSQL using DBeaver

          Deepest pit of an array with Javascript: test on Codility

          Costa Masnaga