Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   raw socket + Node.js (https://javascript.ru/forum/node-js-io-js/82900-raw-socket-node-js.html)

fxobject 01.08.2021 12:07

raw socket + Node.js
 
Уважаемые господа! Нужно собрать некий протокол и к сожалению модуля для него нет. Вернее он есть, но в нем постоянно лезут изнутри ошибки. Придется писать свой. Подскажите чем лучше собрать свой ip пакет.
Какой лучше для этого выбрать модуль и мануал к нему. Просьба писать не список чего есть, а если пользовались. Спасибо

fxobject 01.08.2021 15:52

Хорошо, с этим разобрались, другой вопрос.
По протоколу мне необходимо сначала отправить размер текущего пакета. Т.е. логика передачи сначала идет размер (lenght) и затем сами данные размерностью - lenght.
Размерность команды пусть = 32 байт.
lenght = 32.
Но это число. И у него размерность 64 бита. Т.е. при передаче пойдут лишние нули. необходимо его обрезать до 1 байта (двух байт и т.д. в зависимости от размера команды)
на php раньше делал так:
$length=chr(($length>>8)&0xFF).chr($length & 0xFF);
т.е. циклический сдвиг и контактенция.
не соображу на js как сделать
lenght - число (=32). преобразование в строку даст "32". Уже ничего с этой строкой правильного не сделать.
а метод chr есть у строкового объекта.
может кто нибудь подскажет идею?
Спасибо

fxobject 01.08.2021 15:54

поможет преобразование числа в строку
число = 32 после преобразования - строка = " " (внутри пробел)
есть какой то такой метод? Есть таблицы ASCII что бы по индексу добраться к ней?

SuperZen 03.08.2021 13:11

hint: десятичное 32 это 6 бит

Цитата:

Сообщение от fxobject
lenght = 32.
Но это число. И у него размерность 64 бита.

строка "32" - это два байта, что ровно 16 бит... пусть даже это будет хитрый utf8 - тогда это 32 бита... но нет, числа не будут кодированы по принципам utf ;)

--
для примера: https://en.wikipedia.org/wiki/User_Datagram_Protocol

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

fxobject 04.08.2021 17:16

перешел на работу с объектом 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() типа запланировано исполнение. но текущий контекст прет дальше на следующую иттерацию цикла.
И опять создается промис. херятся настройки класса. короче так работать не будет.
Как только я его ни оборачивал.... ничего в голову не приходит.
Подскажите просто идею....... в цикле действия которые убегают из контекста исполнения и нужно дождаться конца иттерации
Спасибо

SuperZen 04.08.2021 19:08

ipObject.reduce( async (acc, elem) => {
let promise = device.getNATList(elem);
const result = await promise.then().catch();
}, null);

fxobject 04.08.2021 19:29

нет, так работать не будет. попробую обосновать...
итак
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 последней иттерации

fxobject 04.08.2021 19:32

Так же не получится promise.All по той же самой причине. Нельзя создать массив промисов. потому как создание объекта промиса автоматически модифицирует переменные класса

fxobject 04.08.2021 19:34

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

fxobject 04.08.2021 20:44

меняем forEach (для этого перебора - не получилось) на for, небольшая обертка и все как надо. спасибо всем!


Часовой пояс GMT +3, время: 08:46.