Artem
просто как вариант lua socket, но я с ним не работал и не знаю как у него с бэклогом, не будет ли отвалов, если я предыдущий запрос не обработал еще, а пришел новый
Snusmumriken
что можно минималистичного придумать, чтобы сделать внешний сетевой интерфейс? по сути нужно RPC
Самое простое что ты можешь сделать - что-то типа REPL-TCP-сервера, которому пихаешь строку с кодом, он её loadstring'ает и возвращает ответ. https://ilovelua.wordpress.com/передача-данных-по-сети-с-luasocket/
Snusmumriken
Но для этой фиговины нужен или свой клиент, или telnet.
Saphire
*жуёт C*
Saphire
Я 24/7 с ВПН
Artem
я стараюсь без него, насколько это возможно
Snusmumriken
А я — только по нужде (opera vpn для всякого страшного)
Snusmumriken
дожил, ссылка без прокси не открывается
Тэкс, тебе для одного клиента, или сразу тыща народа одновременно подключается и пытается пропихнуть свой код на исполнение?
Snusmumriken
А то : )
Snusmumriken
Или ты типа хочешь передать имя функции, которую надо выполнить, аргументы и получить результат?
Artem
у меня все-таки набор методов есть и думал о msgpack-rpc протоколе
Snusmumriken
Ну я не помню как именно работает RPC (хотя на самом деле помню, нарыл более общее решение)
Artem
в любом случае за ссылку спасибо, это как я понял через сырый сокеты
Snusmumriken
А вот то что ты думал — я не знаю (( Вот этой фиговиной можно делать так: "return MyFunction(10, 20)"
Snusmumriken
в любом случае за ссылку спасибо, это как я понял через сырый сокеты
Это не сырые сокеты а TCP : ) Raw socket — это то, на чём строится и TCP и UDP и все остальные транспортные протоколы, и некоторые прикладные (вроде ping). На сыром TCP.
Artem
Для меня это уже сырые сокеты)))
Snusmumriken
Сырные. Ммм, как крекеры.
Snusmumriken
Для меня это уже сырые сокеты)))
Ну на самом деле, ты можешь не loadstring'ать а кидать json, вроде { func: "MyFunc", args: [10, 20, 30] } А на стороне сервера: local succ, res = xpcall( function() -- data - мы приняли в запросе req = json.decode(data) local func = _G[req.func] local res = {func(unpack(req.args))} return res end, debug.traceback ) resp = { succ = succ, resp = res } tcp:send(json.encode(resp) .. '\r\n')
Слава
Def - бросить вызов Default - стандартное
Слава
Необычно же
Слава
Да никак :) Только заметил и решил поделиться радостью
Deleted
Это не сырые сокеты а TCP : ) Raw socket — это то, на чём строится и TCP и UDP и все остальные транспортные протоколы, и некоторые прикладные (вроде ping). На сыром TCP.
откуда инфа? ping - это icmp с утра вроде было. почему он должен быть на роу-сокетах? спасибо за объяснение
Snusmumriken
Карочи, есть такая штука как модель OSI (стек TCP/IP). Там типа много-много всяких протоколов, на которых строятся другие протоколы. Типа HTTP, который построен на TCP/UDP или чём-то ещё, которые построены на каком-нибудь ipv4/ipv6, которые бла-бла, дальше нас не интересует.
Artem
вот так вообщем сделал: local socket = require("socket") local json = require("cjson") local server = assert(socket.bind("*", 8080)) while 1 do local client = server:accept() local response = {} if (client) then local data, err = client:receive() if not err then local success, request = pcall(json.decode, data); if success and request and request.params and request.method then success, response = pcall(require('methods/' .. request.method:gsub("%.", "/")),request.params); end client:send(json.encode(response) .. "\n") end client:close() end end
mva
и да, 1) передавать полученные извне данные системным командам без ЖЁСТКОЙ проверки на валидность - кака 2) ты проверяешь request на существование, но не проверяешь на существование request.params 3) require (верхние) можно звать без скобок и пробела
Artem
3 пункт - это просто привычка 2 пункт - действительно надо поправить 1 пункт - это взаимодействие между серверами, поэтому в моем случае проверка валидности на другой стороне
Artem
wgetpaste -r
а вот этого сообщения я так и не понял
Artem
В локальной сети-то, iptables
fgntfg
Я тут понял опять что мой ник тоже похож на бота.
Artem
Я тут понял опять что мой ник тоже похож на бота.
А я думал боты как раз нормальные ники генерируют
Artem
Чтобы не выделяться
fgntfg
Типа @Snusmumriken ?
Artem
Например)))
Snusmumriken
Бип-боп
Snusmumriken
Но у тебя по крайней мере куча аватарок есть, где тем более твоя фотка.
Snusmumriken
вот так вообщем сделал: local socket = require("socket") local json = require("cjson") local server = assert(socket.bind("*", 8080)) while 1 do local client = server:accept() local response = {} if (client) then local data, err = client:receive() if not err then local success, request = pcall(json.decode, data); if success and request and request.params and request.method then success, response = pcall(require('methods/' .. request.method:gsub("%.", "/")),request.params); end client:send(json.encode(response) .. "\n") end client:close() end end
Время улучшений. 1. Твоя штука единовременно принимает и обрабатывает только одного клиента. 2. Отсутствие обработки ошибок, скрипты могут уронить весь сервер. 3. Нельзя послать несколько запросов на вызов процедуры, оно всегда обрубает после первого же вызова, надо реконнектиться : ) 4. Блокировка не даёт серверу параллельно заниматься чем-то ещё.
Artem
Вот насчет первого пункта интересно было послушать варианты, мне в целом не нужен параллелизм, но нужно чтобы запросы в очередь становились
Artem
Для понимания, на том конце у меня cleos, который подписывает и отправляет транзакции
Snusmumriken
local socket = require'socket' -- ipv6 в последних сокетах по умолчанию -- а мы пока хотим ipv4 local sock = socket.tcp4 or socket.tcp local server = {} function server:init(port, host) self.clients = {} self.tcp = sock() self.tcp:bind(host or "*", port or 8080) self.tcp:settimeout(0) self.tcp:listen() self.timeout = 60 end function server:accept() local cli = self.tcp:accept() while cli do cli:settimeout(0) -- чтобы обрубать по таймауту self.clients[cli] = os.time() cli = self.tcp:accept() end end function server:call() local time = os.time() for cli, t in pairs(self.clients) do local req, status = cli:receive('*l') if req then -- code execution, response end local wannaclose = req == 'closed' or status == 'closed' if wannaclose or time > t + self.timeout then cli:close() self[cli] = nil end end end function server:update() self:accept() self:call() end server:init() while true do print('update') server:update() socket.sleep(.3) end
Snusmumriken
Моя ли?
В интернете никто не знает что ты кот.
fgntfg
Artem
В интернете никто не знает что ты кот.
слово бот пишется через "б", а не через "к"
Artem
Snusmumriken
В общем, ты вкурил как не блокировать? Везде нулевые таймауты.
Artem
в целом идею понял
Snusmumriken
У HTTP оно сложнее, потому что там могут передавать пару миллиардов гигов данных, которые не влезут в оперативку. Пример простого http-сервера на корутинах (не запустится потому что хочет ещё пару либ, но концепция такая). https://pastebin.com/sJQCK5PJ
Artem
я примерно также на плюсах писал, только еще через epoll
Saphire
У них и имя и фамилия
Saphire
Ты даже не полный бот, так, полубот
Snusmumriken
я примерно также на плюсах писал, только еще через epoll
О, раз на плюсах писал — значит более-менее представляешь что к чему. Тут оно мало отличается, только гибкость выше.
Artem
О, раз на плюсах писал — значит более-менее представляешь что к чему. Тут оно мало отличается, только гибкость выше.
я не то чтобы писал, я в основном и являюсь с++ разработчиком изначально, это потом меня экономики переформировала
Snusmumriken
Ну в целом, возможно и правильно переформатировали. Луа во многом превосходит плюсы по скорости/приятности/структурированности, правда, самих возможностей поменьше :)
Snusmumriken
а что не так с IPv6? Вроде бы как v6-сокеты дуалстек практически везде...
Ну там, если ты на предприятии где не развёрнут v6, не настроены таблицы маршрутизации и т.п. — могут быть проблемы. Так-то я за v6 в большинстве случаев кроме локальных сетей (v4 тупо быстрее, плюс их гарантированно настраивают).
mva
в локальных сетях v6 (ULA) тоже удобен
mva
а вот про "быстрее" - конкретнее плз :)
Saphire
а вот про "быстрее" - конкретнее плз :)
Быстрее в поддержке и пакеты меньшего размера
Snusmumriken
Карочи, расслабься. Когда народ начнёт настраивать его по дефолту и все перейдут на win10/последние линуксы — будет круто. Наверное ))
Snusmumriken
А то ты такой приходишь к админу и говоришь: "хочу ipv6, давай настраивай, мне вот такие вот порты на таких машинах по такому хосту". А он такой: "иди нафиг, не видишь я работаю?", и продолжает играть в кс.
Snusmumriken
Так-то в своих (не-критичных ко времени подключения) сервисах я обычно сначала пытаюсь по v6 подключиться, переключаясь на v4 в случае недоступности, и разворачиваю сразу пару равноправных сокетов на серверах, чтобы коннектились и так и так, в случае проблем. И не я один такой. Гуглхром делает так же, например.
Snusmumriken
а вот про "быстрее" - конкретнее плз :)
Маршрутизация быстрее потому что не надо огромные адреса транслировать/сравнивать/маскофицировать и т.п. v6 круто опрережает v4 по фичам (кол-во адресов и гиговые udp-пакеты — просто бомба), но 1. Снижена человекочитаемость адресов, даже с учётом сокращения 2. Огромные iptables, банлисты/вайтлисты/бла-бла В общем, тут как огромная бочка мёда, так и примерно такая же бочка пусть не дёгтя, но довольно мутной воды Если хоть одно устройство в цепочке маршрутов не тянет v6 или оно там криво настроено — наступает что-то страшное, например поиск нового маршрута.
Artem
у меня оно не завелось и что-то пока не понимаю как поправить
Snusmumriken
Она очень широко распространена, поэтому если ты слышишь "сокеты на луа", то скорее всего это luasocket, в остальных случаях обычно пишут уточнения. На что ругается-то?
Artem
local server = require "server" server:init("*", 8080); while true do server:update(); end
Artem
правильно ведь запускаю?
Snusmumriken
Почти, порт и хост наоборот (хост опционален, а порт меняется чаще всего, поэтому первым аргументом)
Snusmumriken
Зафиксил со всех сторон, глянь ищо раз