LINUX.ORG.RU

Рекурсивный обход дерева

 , ,


0

1

привет Лор, я не программист - алгоритмов и базы в голове нет.
помоги мне с одной задачкой - есть список адресов:

[ '200.112.74.220:23167',
  '91.238.158.130:2508',
  '82.12.152.157:6881',
  '75.158.18.249:28618',
  '187.151.33.245:32752',
  '98.124.55.224:17833',
  '130.185.216.149:51066',
  '90.3.115.150:29037',
  '92.134.227.21:58885',
  '89.190.115.110:45483',
  '134.249.16.221:46045',
  '197.204.189.56:10488',
  '212.194.67.25:44533',
  '95.212.155.93:49978',
  '182.182.107.232:57049',
  '31.176.237.239:25830' ]
если постучаться на любой из адресов он выдаст ещё один список. запрос отправляется по udp4 с помощью node.js
		client.send(msg, 0, msg.length, port, host, function (err, bytes){
		client.on('message', function (response, rinfoFromClient){
                  // вот здесь в response этот список  
		});
	});
и так, я беру любой ip, отправляю ему сообщение, в ответ мне приходит ещё список и так пока все адреса из дерева не обойду.
все примеры на гитхабе это чистое ООП которое _нормальные_ люди не понимают.
что то вроде
this.socket = dgram.createSocket('udp4')
  this.socket.on('message', this.onmessage.bind(this))
//...
//800 строк сплошного   this.a = b.this
//                      this.b = this.this.prototype.this
а я бы по простому хотел, без наследования и конструкторов.
как это делают Лор?

https://github.com/caolan/async#eacharr-iterator-callback

Строго говоря, в ноде нельзя асинхронно большие массивы последовательно перебирать. Стек навернется. Но можно выкрутится, вызывая process.nextTick() после каждой итерации. Если у вас не десятки тысяч переборов, вам хватит. Иначе надо мудрить с очередями задач.

Vit ★★★★★
()

есть список адресов...если постучаться на любой из адресов он выдаст ещё один список

ботнет на node.js ?? современно, модно, ентепрайзно..

MKuznetsov ★★★★★
()

а я бы по простому хотел, без наследования и конструкторов

по простому это типичный spider, без всяких рекурсий и деревьев..то есть очередь ресурсов(адресов) к просмотру и кеш уже просмотренных. Алг: «пока очередь не пуста, получить адрес, если его нет в кеше, обработать и поместить в кеш»

зы. вы привели настолько куцые вырезки кода, что по ним подсказать чё-нить сложно :-) по идее после «// вот здесь в response этот список» элементы списка должны добавиться в некий контейнер, а в какой и как хрен его знает..чуть выше по коду наверное есть работа с этим контейнером (ведь client откуда-то взялся)

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

прошу заметить , что ежель лифо очередь и проверка не на этапе добавления , а перед обработкой то как раз и получим рекурсивный обход хаждуемый ТСом.

qulinxao ★★☆
()

Концепции и подходы ФП как ориентир для альтернативы ООП, но в разумных пределах. Если не программист, то тяжко будет без ООП, рекурсии либо срочно приобретать навыки программиста или...впрочем варианты есть и все решаемо...

swwwfactory ★★
()
Ответ на: комментарий от MKuznetsov

ведь client откуда-то взялся

это dgram

var dgram = require('dgram');
var msg = new Buffer('специально подготовленное сообщение');

var client = dgram.createSocket('udp4');

client.send(msg, 0, msg.length, 6881, 127.0.0.1, function (err, bytes){
	client.on('message', function (response, rinfoFromClient){
                  /* получив массив из response, для каждого адреса запускаем: 
                     client.send(msg, 0, msg.length, port, host, function (err, bytes){
                            client.on('message', function (response, rinfoFromClient){
                                       //получив массив из response, для каждого адреса запускаем ~
                               ...
                  */
		});
	});
вот такая рекурсия, да ещё и должна быть обёрнута в setTimeout я полагаю
вопрос в том, как такое пишут в ФП стиле?

system-root ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.