raw socket + Node.js
Уважаемые господа! Нужно собрать некий протокол и к сожалению модуля для него нет. Вернее он есть, но в нем постоянно лезут изнутри ошибки. Придется писать свой. Подскажите чем лучше собрать свой ip пакет.
Какой лучше для этого выбрать модуль и мануал к нему. Просьба писать не список чего есть, а если пользовались. Спасибо |
Хорошо, с этим разобрались, другой вопрос.
По протоколу мне необходимо сначала отправить размер текущего пакета. Т.е. логика передачи сначала идет размер (lenght) и затем сами данные размерностью - lenght. Размерность команды пусть = 32 байт. lenght = 32. Но это число. И у него размерность 64 бита. Т.е. при передаче пойдут лишние нули. необходимо его обрезать до 1 байта (двух байт и т.д. в зависимости от размера команды) на php раньше делал так: $length=chr(($length>>8)&0xFF).chr($length & 0xFF); т.е. циклический сдвиг и контактенция. не соображу на js как сделать lenght - число (=32). преобразование в строку даст "32". Уже ничего с этой строкой правильного не сделать. а метод chr есть у строкового объекта. может кто нибудь подскажет идею? Спасибо |
поможет преобразование числа в строку
число = 32 после преобразования - строка = " " (внутри пробел) есть какой то такой метод? Есть таблицы ASCII что бы по индексу добраться к ней? |
hint: десятичное 32 это 6 бит
Цитата:
-- для примера: https://en.wikipedia.org/wiki/User_Datagram_Protocol тот дикий понос ) с обрезанием битов, полный ахтунг... пакет на то он и пакет, что в нем выделяется какое-то место под заголовок, в котором описывается структура пакета) |
перешел на работу с объектом Buffer и его отображение uint8array и дальше с двоичной арифметикой вообще нет проблем. тут все клево. может подскажете конструкцию для такой задачи:
имеем массив элементов. и для каждого элемента необходимо последовательно в цикле выполнить процедуру класса примерно так: ipObject.forEach( function(elem) ){ let promise = device.getNATList(elem); promise.then().catch(); }); как бы все просто, НО: итерация цикла должно осуществляться только после выполнения предыдущей решается через async.waterfall но так не хочу. надо через promise ну и тут есть тонкость. device.getNATList(elem) возвращает promise. Но промис в момент выполнения начинает сразу исполнятся до тех пор пока он может оставаться в текущем контексте исполнения. device.getNATList(elem) начинает инициализировать переменныке класса в зависимости от elem и только после этого возможность исполнения заканчивается и объявление промиса вываливается на следующую строку. promise.then() типа запланировано исполнение. но текущий контекст прет дальше на следующую иттерацию цикла. И опять создается промис. херятся настройки класса. короче так работать не будет. Как только я его ни оборачивал.... ничего в голову не приходит. Подскажите просто идею....... в цикле действия которые убегают из контекста исполнения и нужно дождаться конца иттерации Спасибо |
ipObject.reduce( async (acc, elem) => { let promise = device.getNATList(elem); const result = await promise.then().catch(); }, null); |
нет, так работать не будет. попробую обосновать...
итак 1 декларация let promise = device.getNATList(elem); мы не только получили промис но и частично выполнили функцию. например в ее начале был код this.ip = elem.ip. 2 await то он await. выполнение функции getNATList отложено, но не отложено выполнение цикла. поэтому цикл продолжает работать 3 есть один await с this.ip = elem.ip идем на вторую иттерацию.... а в ней создаем опять промис и опять меняем this.ip. И нетудно заметить, что это один и тот же объект и так проходим весь цикл. в конце цикла this.ip = elem.ip последнего элемента. и затем управление побежало дальше пока не попало в ядро. а там нужно выполнять три авайта и у каждого из них this.ip равено одному и тому же значению - elem.ip последней иттерации |
Так же не получится promise.All по той же самой причине. Нельзя создать массив промисов. потому как создание объекта промиса автоматически модифицирует переменные класса
|
есть одна мысля....... хотелось бы не изобретать велосипед, есть ведь опыт
у людей |
меняем forEach (для этого перебора - не получилось) на for, небольшая обертка и все как надо. спасибо всем!
|
Часовой пояс GMT +3, время: 06:10. |