Que tal compañeros, hace unos días estaba intentando hacer ping ICMP a una IP desde NodeJS. Pero como es norma en el foro, no vengo con las manos vacías, me he encontrado con algunos post incluso en esta web hablando de cómo hacer esto, pero ninguno me convence.
Uno de los parámetros inamovibles de mi proyecto es evitar el uso de NPM/Node-GYP. Por lo tanto, se descarta la opción de usar raw-sockets (a menos que pueda usar código C ++ en NodeJS sin usar cosas externas al nodo).
También probé (e implementé) la opción de usar comandos del sistema, aquí puedes ver mi implementación válida para Linux y Windows (no la he probado en Mac pero estoy casi seguro que funciona)
'use strict'; import { execSync } from "child_process"; class Ping { #stdoutToMS (stdout) { let res; let a = stdout.split('='); for (let i = 0; i < a.length; i++) { res = a[i].split("ms"); } return ~~res[0].split('/')[0].trim(); } ping (host, timeout = 5000) { let mstout = timeout / 1000; let stdout; try { if (process.platform === "win32") { stdout = execSync("ping -n 1 -l 1 -w " + timeout + ' ' + host); } else { stdout = execSync("ping -c 1 -s 16 -W " + mstout + ' ' + host); } } catch (err) { return false; } return this.#stdoutToMS(stdout.toString()); } }; export default Ping;Si alguien tiene alguna idea sobre cómo hacer esto de forma nativa en el nodo sin usar software externo, estaría muy agradecido si me lo dijera.
No parece que pueda acceder a un equivalente de ping desde nodejs sin algún código externo.
Dado que ping usa el protocolo ICMP para hacer lo que hace (y tiene que usar ese protocolo porque está tratando de contactar a un punto final que está escuchando eso) y no hay implementación del protocolo ICMP en nodejs, su única opción sería cree su propia implementación del protocolo ICMP completamente en código nodejs al obtener acceso a un socket RAW OS e implementar el protocolo usted mismo. No conozco ninguna capacidad integrada para obtener un socket RAW en nodejs simples (sin software externo).
Los únicos ejemplos de implementación de ICMP que pude encontrar en nodejs TODOS usan código externo para crear acceso a un socket sin procesar. Eso parece ser una verificación de que no hay otra forma de hacerlo.
Aquí hay un módulo que expone un socket sin procesar, pero usa código nativo para implementarlo. Puede examinar su implementación para ver qué está haciendo.
También existe esta biblioteca que expone un socket RAW de libuv para ser utilizado dentro de nodejs, pero también utiliza parte de su propio código nativo.