0

нужна помощь с модулем, пишу модуль для обработки поиска других участников в локальной сети, и проблема в том, что скрипт выполняет код сначала после цикла судя по всему а потом уже сам код который в цикле, просьба простить за корявое описани проблемы, если будут вопросы - спрашивайте. Код :

const { getIPRange } = require('get-ip-range');
const fs = require('fs');
const net = require('net');
const data = fs.readFileSync("../conf/config.json", "utf8");
const config = JSON.parse(data);
const array = getIPRange(config.network_configuration.network);

const available_nodes = Array(); for (let x = 0; x < array.length; x++) {

const client = net.connect({port: 14050, hostname: array[x]});

    client.write(&quot;ver&quot;);

    client.on(&quot;data&quot;, (data) =&gt; {
        if (data.toString().includes(&quot;FreeP2P v&quot;) == true) {
            console.log(&quot;nice&quot;); // Debug message (Выполняется после цикла почему-то.)
            available_nodes.push(array[x]);
            client.end();
        }
    });

    client.on(&quot;error&quot;, (err) =&gt; {});
    if (x != array.length - 1){
        break;
    }
    x++;

} console.log(available_nodes);

Файл конфигурации из кода:

{
    "network_configuration":
    {
        "network":"192.168.0.1/24"
    }   
}

1 Answers1

0
const { getIPRange } = require('get-ip-range');
const net = require('net');

(async () => {
  const ipAddresses = getIPRange('192.168.0.1/24');
  const res = await Promise.allSettled(
    ipAddresses.map((ip) => new Promise((resolve, reject) => {
      try {
        const socket = net.connect(
          { port: 14050, host: ip, timeout: 5 * 1000 },
          () => {
            socket.once('data', (chunk) => {
              resolve(
                chunk.toString('utf-8').includes('FreeP2P v')
              );
              socket.destroy();
            });
            socket.write('ver');
          }
        );

        socket.on('error', (err) => reject(err));
        socket.on('timeout', () => {
          reject(new Error('TIMED_OUT'));
          socket.destroy();
        });
      } catch (err) {
        reject(err);
      }
    })),
  );

  const availableNodes = res.reduce(
    (acc, x, idx) => {
      if (x.status === 'fulfilled' && x.value === true) {
        acc.push(ipAddresses[idx]);
      }
      return acc;
    },
    [],
  );

  console.log('availableNodes', availableNodes);
})();

nörbörnën
  • 12,192
  • 5
  • 29
  • 40
  • 1
    решение умозрительное так как в моей сети таких зверей нет – nörbörnën Aug 31 '21 at 16:05
  • Потестирую, спасибо. –  Sep 01 '21 at 14:24
  • Спасибо больше! Работает идеально, можете подсказать, что было в моём коде не так и что вы сделали? Что бы я хоть что то понял –  Sep 01 '21 at 14:27
  • что было в моём коде не так и что вы сделали, увы, в вашем коде было не так всё. написанная вами программа написана для какого-то синхронного движка (или языка типа python/perl), но не для nodejs. пояснение [асинхронного] подхода, на котором основана работа nodejs, займёт пару часов и вряд ли поместится в формат комментария. так что для самостоятельного изучения: – nörbörnën Sep 01 '21 at 16:52
  • 1
    https://learn.javascript.ru/async – nörbörnën Sep 01 '21 at 16:52
  • 1
    https://learn.javascript.ru/event-loop – nörbörnën Sep 01 '21 at 16:53
  • 1
    https://nodejs.org/ru/docs/guides/blocking-vs-non-blocking/ – nörbörnën Sep 01 '21 at 16:53
  • 1
    https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/ – nörbörnën Sep 01 '21 at 16:53
  • 1
    https://nodejs.org/en/docs/guides/dont-block-the-event-loop/ – nörbörnën Sep 01 '21 at 16:53
  • 1
    https://nodejs.org/dist/latest/docs/api/net.html – nörbörnën Sep 01 '21 at 16:56
  • Спасибо большое. –  Sep 02 '21 at 09:02