logic 51 Опубликовано: 15 марта, 2022 (изменено) мой мод для openOS(а вернее библиотека networks) позволяет объединять компьютеры в одну локальную или не очень сеть функционал: пересылка таблиц и под таблиц(для работы таблиц в event нужен мой мод для openOS) отправка пакетов с любым количеством элементов и размерностью ретрансляция между устройствами(можно поставить серверную стойку с 8 туннельных карт а в публичных местах поставить компы с туннельными картами и модемом к которому уже будут подключаться конечные пользователи) но следует помнить что избыточное количества ретрансляторов приводит к заторможенности сити distfs2: отдельная библиотека позволяющая удобно хостить файловые системы/папки и подключаться к ним тема мода для openOS: Изменено 15 марта, 2022 пользователем rootmaster 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Asior 586 Опубликовано: 15 марта, 2022 Как работать с ней? Опции, настройки, документация? Скрины, принципы работы, настройка? Ничего не понятно ... 3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ProgramCrafter 544 Опубликовано: 17 марта, 2022 (изменено) Is it time to analyze code? networks.lua (не особо разбирался, что и как работает) Скрытый текст local component = require("component") local event = require("event") local serialization = require("serialization") local su = require("superUtiles") local computer = require("computer") local bigModem = require("bigModem") ------------------------------------------- local noAddress local function raw_send(devices, name, code, data, obj, isResend, port) local noAddress2 = noAddress noAddress = nil for i = 1, #devices do local device = devices[i] if isResend then if device["resend"] == nil then if not obj.resend then goto skip end elseif device["resend"] == false then goto skip end end local proxy = component.proxy(device[1]) if proxy.type == "modem" then if isResend and proxy.address == noAddress2 and device[2] == port and (not proxy.isWireless() or device[3] == 0) then goto skip end local strength = device[3] local oldStrength if proxy.isWireless() then if strength then oldStrength = proxy.getStrength() proxy.setStrength(strength) end end device.bigModem.broadcast(device[2], "network", name, code, data) if oldStrength then proxy.setStrength(oldStrength) end elseif proxy.type == "tunnel" then if not isResend or proxy.address ~= noAddress2 then device.bigModem.broadcast(0, "network", name, code, data) end else error("unsupported device") end ::skip:: end end local function isType(data, target) return type(data) == target end ------------------------------------------- local lib = {} lib.networks = {} function lib.create(devices, name, resend) checkArg(1, devices, "table") checkArg(2, name, "string") local obj = {} obj.devices = devices obj.name = name obj.resend = resend obj.listens = {} -------------------------------------------------- for i = 1, #obj.devices do local device = obj.devices[i] local proxy = component.proxy(device[1]) device.bigModem = bigModem.create(device[1]) if proxy.type == "modem" then device.isOpen = proxy.open(device[2]) end end -------------------------------------------------- local messagebuffer = {} local life = {} local function cleanBuffer() for key, value in pairs(life) do if computer.uptime() - value > 8 then messagebuffer[key] = nil life[key] = nil end end end obj.listens[#obj.listens + 1] = event.timer(1, cleanBuffer, math.huge) local function addcode(code) local index = su.generateRandomID() messagebuffer[index] = code or su.generateRandomID() life[index] = computer.uptime() return messagebuffer[index] end local function listen(_, this, _, port, _, objCode, messagetype, name, code, data) if not isType(messagetype, "string") or not isType(name, "string") or not isType(code, "string") then return end if su.inTable(messagebuffer, code) or name ~= obj.name or messagetype ~= "network" then return end local ok = false local device for i = 1, #obj.devices do device = obj.devices[i] if device[1] == this and (port == 0 or device[2] == port) and device.bigModem.objCode == objCode then ok = true break end end if not ok then return end addcode(code) local function resendPack() noAddress = this raw_send(obj.devices, obj.name, code, data, obj, true, port) end if device["resend"] == nil then if obj.resend then resendPack() end elseif device["resend"] == true then resendPack() end local out = serialization.unserialize(data) event.push("network_message", obj.name, su.unpack(out)) end table.insert(obj.listens, event.listen("big_message", listen)) -------------------------------------------------- function obj.send(...) local data = serialization.serialize({...}) raw_send(obj.devices, obj.name, addcode(), data, obj) end lib.networks[#lib.networks + 1] = obj local thisIndex = #lib.networks function obj.kill() for i = 1, #obj.listens do event.cancel(obj.listens[i]) end for i = 1, #obj.devices do local device = obj.devices[i] device.bigModem.kill() if device["isOpen"] then component.proxy(device[1]).close(device[2]) end end table.remove(lib.networks, thisIndex) end return obj end function lib.getDevices(tunnels, modems, wiredModems, wirelessModems, modemsPort, modemsStrength) if not modemsPort then modemsPort = 88 end if not modemsStrength then modemsStrength = math.huge end ------------------------------------------------------ local devices = {} if tunnels then for address in component.list("tunnel") do devices[#devices + 1] = {address} end end if wiredModems then for address in component.list("modem") do if component.invoke(address, "isWired") and not component.invoke(address, "isWireless") then devices[#devices + 1] = {address, modemsPort, modemsStrength} end end end if wirelessModems then for address in component.list("modem") do if not component.invoke(address, "isWired") and component.invoke(address, "isWireless") then devices[#devices + 1] = {address, modemsPort, modemsStrength} end end end if modems then for address in component.list("modem") do devices[#devices + 1] = {address, modemsPort, modemsStrength} end end return devices end function lib.getNetwork(name) for i = 1, #lib.networks do if lib.networks[i].name == name then return lib.networks[i] end end end return lib Изменено 17 марта, 2022 пользователем ProgramCrafter код под спойлер 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ProgramCrafter 544 Опубликовано: 17 марта, 2022 И библиотека bigModem, от которой всё это зависит (она занимается, видимо, пересылкой больших сообщений и ретрансляцией сообщения по всем компьютерам в сети, как Zn): Скрытый текст local component = require("component") local event = require("event") local serialization = require("serialization") local su = require("superUtiles") local computer = require("computer") ------------------------------------------ ------------------------------------------ local lib = {} lib.devices = {} function lib.create(address, maxPacketSize, dupProtectTimeout, dupProtectUpdateTimeout) local obj = {} obj.address = address obj.maxPacketSize = maxPacketSize or 7168 obj.proxy = component.proxy(obj.address) obj.dupProtectTimeout = dupProtectTimeout or 8 obj.dupProtectUpdateTimeout = dupProtectUpdateTimeout or 1 obj.objCode = su.generateRandomID() obj.listens = {} obj.codes = {} obj.timeouts = {} local function addcode(code) if su.inTable(obj.codes, code) then return false else table.insert(obj.codes, code) table.insert(obj.timeouts, computer.uptime()) return true end end table.insert(obj.listens, event.timer(obj.dupProtectUpdateTimeout, function() for i, code in pairs(obj.codes) do local timeout = obj.timeouts[i] if computer.uptime() - timeout > obj.dupProtectTimeout then table.remove(obj.codes, i) table.remove(obj.timeouts, i) end end end, math.huge)) function obj.send(targetAddress, port, ...) local proxy = obj.proxy local sendData = serialization.serialize({...}) local parts = su.toParts(sendData, obj.maxPacketSize) local randomCode = su.generateRandomID() for i, part in ipairs(parts) do local endflag = i == #parts local unicallCode = su.generateRandomID() addcode(unicallCode) if component.type(obj.address) == "tunnel" then proxy.send(unicallCode, endflag, randomCode, i, part) else if targetAddress == true then proxy.broadcast(port, unicallCode, endflag, randomCode, i, part) else proxy.send(targetAddress, port, unicallCode, endflag, randomCode, i, part) end end end end function obj.broadcast(port, ...) obj.send(true, port, ...) end local buffer = {} table.insert(obj.listens, event.listen("modem_message", function(_, uuid, sender, port, dist, unicallCode, endflag, randomCode, index, dat) if uuid ~= obj.address or not addcode(unicallCode) then return end if not buffer[randomCode] then buffer[randomCode] = {} end buffer[randomCode][index] = dat if endflag then local sendData = serialization.unserialize(table.concat(buffer[randomCode])) buffer[randomCode] = nil event.push("big_message", uuid, sender, port, dist, obj.objCode, su.unpack(sendData)) end end)) function obj.kill() for i = 1, #obj.listens do event.cancel(obj.listens[i]) end table.remove(lib.devices, obj.indexInTable) end table.insert(lib.devices, obj) obj.indexInTable = #lib.devices return obj end return lib 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
logic Автор темы 51 Опубликовано: 21 марта, 2022 В 15.03.2022 в 19:53, Asior сказал: Как работать с ней? Опции, настройки, документация? Скрины, принципы работы, настройка? Ничего не понятно ... networks библиотека сетей, distfs2 библиотека дистанционной файловой системмы нада сам разберись все работает без нариканий 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Bs0Dd 206 Опубликовано: 21 марта, 2022 (изменено) 2 часа назад, rootmaster сказал: нада сам разберись Гениально, просто лучший ответ разработчика. В таком случае, не стоит удивляться, если твоим софтом будут пользоваться по схеме "надо, сам и пользуйся". А кстати подобная фишка у меня была кажется... точно - Только тут все задокументировано). Изменено 21 марта, 2022 пользователем Bs0Dd 3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
logic Автор темы 51 Опубликовано: 3 апреля, 2022 (изменено) В 17.03.2022 в 08:05, ProgramCrafter сказал: И библиотека bigModem, от которой всё это зависит (она занимается, видимо, пересылкой больших сообщений и ретрансляцией сообщения по всем компьютерам в сети, как Zn): Показать содержимое local component = require("component") local event = require("event") local serialization = require("serialization") local su = require("superUtiles") local computer = require("computer") ------------------------------------------ ------------------------------------------ local lib = {} lib.devices = {} function lib.create(address, maxPacketSize, dupProtectTimeout, dupProtectUpdateTimeout) local obj = {} obj.address = address obj.maxPacketSize = maxPacketSize or 7168 obj.proxy = component.proxy(obj.address) obj.dupProtectTimeout = dupProtectTimeout or 8 obj.dupProtectUpdateTimeout = dupProtectUpdateTimeout or 1 obj.objCode = su.generateRandomID() obj.listens = {} obj.codes = {} obj.timeouts = {} local function addcode(code) if su.inTable(obj.codes, code) then return false else table.insert(obj.codes, code) table.insert(obj.timeouts, computer.uptime()) return true end end table.insert(obj.listens, event.timer(obj.dupProtectUpdateTimeout, function() for i, code in pairs(obj.codes) do local timeout = obj.timeouts[i] if computer.uptime() - timeout > obj.dupProtectTimeout then table.remove(obj.codes, i) table.remove(obj.timeouts, i) end end end, math.huge)) function obj.send(targetAddress, port, ...) local proxy = obj.proxy local sendData = serialization.serialize({...}) local parts = su.toParts(sendData, obj.maxPacketSize) local randomCode = su.generateRandomID() for i, part in ipairs(parts) do local endflag = i == #parts local unicallCode = su.generateRandomID() addcode(unicallCode) if component.type(obj.address) == "tunnel" then proxy.send(unicallCode, endflag, randomCode, i, part) else if targetAddress == true then proxy.broadcast(port, unicallCode, endflag, randomCode, i, part) else proxy.send(targetAddress, port, unicallCode, endflag, randomCode, i, part) end end end end function obj.broadcast(port, ...) obj.send(true, port, ...) end local buffer = {} table.insert(obj.listens, event.listen("modem_message", function(_, uuid, sender, port, dist, unicallCode, endflag, randomCode, index, dat) if uuid ~= obj.address or not addcode(unicallCode) then return end if not buffer[randomCode] then buffer[randomCode] = {} end buffer[randomCode][index] = dat if endflag then local sendData = serialization.unserialize(table.concat(buffer[randomCode])) buffer[randomCode] = nil event.push("big_message", uuid, sender, port, dist, obj.objCode, su.unpack(sendData)) end end)) function obj.kill() for i = 1, #obj.listens do event.cancel(obj.listens[i]) end table.remove(lib.devices, obj.indexInTable) end table.insert(lib.devices, obj) obj.indexInTable = #lib.devices return obj end return lib если у вас чтото не работает не значит что не работает у всех, я только так сеть и делаю, нет буквально только через networks и она точно работает, покажите пример кода который не работает, и нет bigModem не ретранслирует сообщения это задача лежит на networks, bigModem защищает от повтаряюшихся сообщения разбавит пакет и позволяет передать таблицу(это функционал(не разбивка а только зашита от повторения из за циклов в сетях) продублирован в networks так как когда я убрал это дублирования функционала чтото стала работает не так(я уже не помню что)) Изменено 3 апреля, 2022 пользователем rootmaster 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах