Artem
просто как вариант lua socket, но я с ним не работал и не знаю как у него с бэклогом, не будет ли отвалов, если я предыдущий запрос не обработал еще, а пришел новый
Snusmumriken
Но для этой фиговины нужен или свой клиент, или telnet.
Saphire
*жуёт C*
Artem
Saphire
Saphire
Я 24/7 с ВПН
Artem
я стараюсь без него, насколько это возможно
Snusmumriken
А я — только по нужде (opera vpn для всякого страшного)
Artem
Snusmumriken
А то : )
Snusmumriken
Или ты типа хочешь передать имя функции, которую надо выполнить, аргументы и получить результат?
Artem
у меня все-таки набор методов есть и думал о msgpack-rpc протоколе
Snusmumriken
Ну я не помню как именно работает RPC (хотя на самом деле помню, нарыл более общее решение)
Artem
в любом случае за ссылку спасибо, это как я понял через сырый сокеты
Snusmumriken
А вот то что ты думал — я не знаю ((
Вот этой фиговиной можно делать так:
"return MyFunction(10, 20)"
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
Snusmumriken
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
mva
и да,
1) передавать полученные извне данные системным командам без ЖЁСТКОЙ проверки на валидность - кака
2) ты проверяешь request на существование, но не проверяешь на существование request.params
3) require (верхние) можно звать без скобок и пробела
Artem
3 пункт - это просто привычка
2 пункт - действительно надо поправить
1 пункт - это взаимодействие между серверами, поэтому в моем случае проверка валидности на другой стороне
mva
Artem
В локальной сети-то, iptables
fgntfg
Я тут понял опять что мой ник тоже похож на бота.
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
fgntfg
Snusmumriken
Моя ли?
В интернете никто не знает что ты кот.
fgntfg
Snusmumriken
Artem
Snusmumriken
В общем, ты вкурил как не блокировать?
Везде нулевые таймауты.
Artem
Artem
в целом идею понял
Snusmumriken
У HTTP оно сложнее, потому что там могут передавать пару миллиардов гигов данных, которые не влезут в оперативку.
Пример простого http-сервера на корутинах (не запустится потому что хочет ещё пару либ, но концепция такая).
https://pastebin.com/sJQCK5PJ
Artem
я примерно также на плюсах писал, только еще через epoll
Saphire
Saphire
У них и имя и фамилия
Saphire
Ты даже не полный бот, так, полубот
Artem
Snusmumriken
Ну в целом, возможно и правильно переформатировали. Луа во многом превосходит плюсы по скорости/приятности/структурированности, правда, самих возможностей поменьше :)
mva
mva
в локальных сетях v6 (ULA) тоже удобен
mva
а вот про "быстрее" - конкретнее плз :)
mva
Snusmumriken
Карочи, расслабься. Когда народ начнёт настраивать его по дефолту и все перейдут на win10/последние линуксы — будет круто. Наверное ))
Snusmumriken
А то ты такой приходишь к админу и говоришь: "хочу ipv6, давай настраивай, мне вот такие вот порты на таких машинах по такому хосту". А он такой: "иди нафиг, не видишь я работаю?", и продолжает играть в кс.
Snusmumriken
Так-то в своих (не-критичных ко времени подключения) сервисах я обычно сначала пытаюсь по v6 подключиться, переключаясь на v4 в случае недоступности, и разворачиваю сразу пару равноправных сокетов на серверах, чтобы коннектились и так и так, в случае проблем.
И не я один такой. Гуглхром делает так же, например.
Snusmumriken
а вот про "быстрее" - конкретнее плз :)
Маршрутизация быстрее потому что не надо огромные адреса транслировать/сравнивать/маскофицировать и т.п.
v6 круто опрережает v4 по фичам (кол-во адресов и гиговые udp-пакеты — просто бомба), но
1. Снижена человекочитаемость адресов, даже с учётом сокращения
2. Огромные iptables, банлисты/вайтлисты/бла-бла
В общем, тут как огромная бочка мёда, так и примерно такая же бочка пусть не дёгтя, но довольно мутной воды
Если хоть одно устройство в цепочке маршрутов не тянет v6 или оно там криво настроено — наступает что-то страшное, например поиск нового маршрута.
Artem
Snusmumriken
Artem
у меня оно не завелось и что-то пока не понимаю как поправить
Snusmumriken
Она очень широко распространена, поэтому если ты слышишь "сокеты на луа", то скорее всего это luasocket, в остальных случаях обычно пишут уточнения.
На что ругается-то?
Artem
local server = require "server"
server:init("*", 8080);
while true do
server:update();
end
Artem
правильно ведь запускаю?
Snusmumriken
Почти, порт и хост наоборот (хост опционален, а порт меняется чаще всего, поэтому первым аргументом)
Snusmumriken
Зафиксил со всех сторон, глянь ищо раз