Перейти к содержимому
rootmaster

хостинг папки и локальная сеть

Рекомендуемые сообщения

мой мод для openOS(а вернее библиотека networks)

позволяет объединять компьютеры в одну локальную или не очень сеть

 

функционал:

  • пересылка таблиц и под таблиц(для работы таблиц в event нужен мой мод для openOS)
  • отправка пакетов с любым количеством элементов и размерностью
  • ретрансляция между устройствами(можно поставить серверную стойку с 8 туннельных карт а в публичных местах поставить компы с туннельными картами и модемом к которому уже будут подключаться конечные пользователи) но следует помнить что избыточное количества ретрансляторов приводит к заторможенности сити

distfs2:

отдельная библиотека позволяющая удобно хостить файловые системы/папки и подключаться к ним

 

тема мода для openOS: 

 

Изменено пользователем rootmaster

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Как работать с ней? Опции, настройки, документация? Скрины, принципы работы, настройка? Ничего не понятно ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

 

Изменено пользователем 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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 15.03.2022 в 19:53, Asior сказал:

Как работать с ней? Опции, настройки, документация? Скрины, принципы работы, настройка? Ничего не понятно ...

networks библиотека сетей, distfs2 библиотека дистанционной файловой системмы нада сам разберись все работает без нариканий

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, rootmaster сказал:

нада сам разберись

Гениально, просто лучший ответ разработчика. В таком случае, не стоит удивляться, если твоим софтом будут пользоваться по схеме "надо, сам и пользуйся".

 

А кстати подобная фишка у меня была кажется... точно - 

Только тут все задокументировано).

 

Изменено пользователем Bs0Dd

Поделиться сообщением


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

Изменено пользователем rootmaster

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...