Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.08.2021, 12:07
Аватар для fxobject
Кандидат Javascript-наук
Отправить личное сообщение для fxobject Посмотреть профиль Найти все сообщения от fxobject
 
Регистрация: 01.03.2021
Сообщений: 138

raw socket + Node.js
Уважаемые господа! Нужно собрать некий протокол и к сожалению модуля для него нет. Вернее он есть, но в нем постоянно лезут изнутри ошибки. Придется писать свой. Подскажите чем лучше собрать свой ip пакет.
Какой лучше для этого выбрать модуль и мануал к нему. Просьба писать не список чего есть, а если пользовались. Спасибо
Ответить с цитированием
  #2 (permalink)  
Старый 01.08.2021, 15:52
Аватар для fxobject
Кандидат Javascript-наук
Отправить личное сообщение для fxobject Посмотреть профиль Найти все сообщения от fxobject
 
Регистрация: 01.03.2021
Сообщений: 138

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

поможет преобразование числа в строку
число = 32 после преобразования - строка = " " (внутри пробел)
есть какой то такой метод? Есть таблицы ASCII что бы по индексу добраться к ней?
Ответить с цитированием
  #4 (permalink)  
Старый 03.08.2021, 13:11
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 641

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

Сообщение от fxobject
lenght = 32.
Но это число. И у него размерность 64 бита.
строка "32" - это два байта, что ровно 16 бит... пусть даже это будет хитрый utf8 - тогда это 32 бита... но нет, числа не будут кодированы по принципам utf

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

тот дикий понос ) с обрезанием битов, полный ахтунг... пакет на то он и пакет, что в нем выделяется какое-то место под заголовок, в котором описывается структура пакета)
Ответить с цитированием
  #5 (permalink)  
Старый 04.08.2021, 17:16
Аватар для fxobject
Кандидат Javascript-наук
Отправить личное сообщение для fxobject Посмотреть профиль Найти все сообщения от fxobject
 
Регистрация: 01.03.2021
Сообщений: 138

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

Последний раз редактировалось fxobject, 04.08.2021 в 17:21.
Ответить с цитированием
  #6 (permalink)  
Старый 04.08.2021, 19:08
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 641

ipObject.reduce( async (acc, elem) => {
let promise = device.getNATList(elem);
const result = await promise.then().catch();
}, null);
Ответить с цитированием
  #7 (permalink)  
Старый 04.08.2021, 19:29
Аватар для fxobject
Кандидат Javascript-наук
Отправить личное сообщение для fxobject Посмотреть профиль Найти все сообщения от fxobject
 
Регистрация: 01.03.2021
Сообщений: 138

нет, так работать не будет. попробую обосновать...
итак
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 последней иттерации
Ответить с цитированием
  #8 (permalink)  
Старый 04.08.2021, 19:32
Аватар для fxobject
Кандидат Javascript-наук
Отправить личное сообщение для fxobject Посмотреть профиль Найти все сообщения от fxobject
 
Регистрация: 01.03.2021
Сообщений: 138

Так же не получится promise.All по той же самой причине. Нельзя создать массив промисов. потому как создание объекта промиса автоматически модифицирует переменные класса
Ответить с цитированием
  #9 (permalink)  
Старый 04.08.2021, 19:34
Аватар для fxobject
Кандидат Javascript-наук
Отправить личное сообщение для fxobject Посмотреть профиль Найти все сообщения от fxobject
 
Регистрация: 01.03.2021
Сообщений: 138

есть одна мысля....... хотелось бы не изобретать велосипед, есть ведь опыт
у людей
Ответить с цитированием
  #10 (permalink)  
Старый 04.08.2021, 20:44
Аватар для fxobject
Кандидат Javascript-наук
Отправить личное сообщение для fxobject Посмотреть профиль Найти все сообщения от fxobject
 
Регистрация: 01.03.2021
Сообщений: 138

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SSO авторизация с кроссдоменными запросами Windows server + Node.js + Angular sniffysko Angular.js 0 28.03.2019 12:42
Web сайт на Node.js (практика) Obelix Node.JS 2 08.02.2016 18:37
Чат на node.js + socket mesitar Работа 8 04.01.2015 10:07
Востребованность разработчиков на Node.js danik.js AJAX и COMET 7 08.12.2012 22:49
Node.js Kolyaj Серверные языки и технологии 49 24.05.2010 22:29