Валентин
Вопрос local function writeSocket() local debughost, debugport = "127.0.0.1", 32154 print("Attempting connection to host '" ..debughost.. "' and port " ..debugport.. "...") local text = "POST /e1crdbg/rdbgTest?cmd=test HTTP/1.1" local tcp = assert(socket.connect(debughost, debugport)) --note the newline below assert(tcp:send(text.."\n")) local s, status = tcp:receive() print(s) print(status) tcp:close() end; зависает на строке local s, status = tcp:receive() Подскажите почему? (быстрый гуглеж не помог)
Igor
Отправлять в соткет нужно не с одним NL символом запрос а с двумя
Igor
Потому что с одним - сервер в ожидании заголовков находится
Igor
То есть у тебя получится ...:send(text .. '\n\n')
Igor
А, ну и заголовок Content-Length по стандарту обязателен, если делаешь POST, если мне память не изменяет
Igor
В общем после заголовков у тебя должна быть отправлена пустая строка, таким образом сервер поймёт, что заголовки кончились и началось тело запроса (если оно нужно вообще), в ответе от сервера такая же петрушка
Snusmumriken
Блокирующие сокеты блокируют: 1. До полного приёма (как правило, когда сокет отсоединяется) 2. До таймаута Есть специальные опции типа tcp:receive("*l"), чтобы принимать построчно (разделитель \r\n или аналог), или tcp:receive(1024), чтобы принять 1024 байта. До момента пока не пришлют — не разблокирует.
Snusmumriken
Например, http-сервер, по синхронной классике, принимает запросы примерно так: local req = {} local line = tcp:receive('*l') local a, b, c = line:match("(%w+) (/%S*) (.*)") req.verb, req.location, req._v = a, b, c req.headers = {} -- в конце заголовков идёт пустая строка line = tcp:receive('*l') while line ~= "" do local k, v = line:match("(.-): (.*)") req.headers[k] = v line = tcp:receive('*l') end local len = req.headers["Content-Length"] or 0 len = tonumber(len) req.body = len and tcp:receive(len) --*тут можно прерывать, переходить к чтению следующего запроса и т.д.* Оно не примет чанковое содержимое, сломается на попытке залить пару гигов (x32) и в целом нифига не асинхронное, но для баловства — вполне.
Snusmumriken
Приём соответственно такой: local resp = {} local line = tcp:receive('*l') local a, b, c = line:match("(.-) (%d+) (.*)") resp._v, resp.status, resp.sstatus = a, b, c resp.headers = {} ... остальное аналогично серверу.
Snusmumriken
Нет, нужно чтобы принять до разрыва соединения.
Igor
Если он не задан, то receive по дефолту строку, разделунную [CR +] LF ждёт
Snusmumriken
Дефолтное значение, помнится, *а, то есть до разрыва.
Igor
Snusmumriken
Хмм, тогда чего у товарища не зашло? Интересно.
Igor
У меня из-за этого на первых порах работы с луёвыми сокетами, как раз и были проблемы. Я думал, что "*a" - дефолтный и не понимал, почему выходные данные бинарные у меня выходили левые какие-то
Snusmumriken
А, тощна. А я всегда указываю что принимаю, и у меня нет проблем ))
Anonymous
всем привет! давно хотел задать вопрос знатокам, так сказать. вот все тут же знакомы с опен компьютерс/компьютер крафт модами на майнкрафт. я не встречал публичных серверов с данными модами. все вопросы к админам "почему?" отвечались типо "ломанут". так собственно вопрос: никто не заморачивался или действительно нельзя, скажем так, как то подпилить данные моды, чтобы не было путей обходных, для людей которые с мозгами и могут хакнуть?
fgntfg
Могу поднять с CC. И пофиг на попытки взлома.
fgntfg
Но зачем?
fgntfg
Мне уже играть некогда
Anonymous
порт майна на луа есть уже?
fgntfg
Есть minetest. Там, кажется, была lua
fgntfg
Портировать кубы целиком с java на lua такое себе развлечение.
Anonymous
да понятно. просто рекурсия. ну ты понял
fgntfg
Если хочется прям на lua кубы - 100% были эксперименты с löve
Anonymous
fgntfg
пришло время обновить драйвера
Anonymous
@Snusmumriken можно сделать примерно такого же бота, но на луа? P.S. Этот сделан на питоне
Anonymous
Всем привет
Anonymous
да хоть на vb6
Anonymous
в этом и заключается суть апи
Anonymous
привет
Привет .
Anonymous
хоть на ассемблере)) только жизнь не так длинна, увы
Anonymous
Ага😂
fgntfg
Lua - тьюринг полный язык, значит можно написать все что угодно.
mva
@Snusmumriken @CyberSpirit
Highly Likely
Done :)
Anonymous
это что было щас?
Anonymous
офигеть
Highly Likely
Спам-бот
Co(n)stantine👨‍🔬
компилер
https://github.com/rxi/lite
Snusmumriken
компилер
Компилер — это фактически превращатель одного текста в другой, с потенциальными проверками корректности первого текста.
Snusmumriken
Snusmumriken
Но, кстати, компилятор, в отличии от текстового редактора, можно написать на pure lua. Даже в консольной тексторвой фигне надо знать, какие нажимаются кнопки.
Валентин
Есть желающие потратить вечер времени на помощь начинающему? научился принимать запросы (сервер на сокете по примеру собран), отправлять запросы (тоже по примеру все собрано) - надо как-то все соединить в кучу Помощь могу оплатить - но не сильно много
Anonymous
К слову это было позавчера, я сейчас в полной ж... в полной безопасности
Валентин
https://pastebin.com/n3GiqT3A Знаю что код чиать будет тяжело но все же попытаюсь объяснить Итак - readSocket это типа сервера, принимает сообщения от клиентов writeSocket - пересылает сообщения дальше Не понимаю 1. как в функции readSocket из присланого клиентом "POST /e1crdbg/rdbgTest?cmd=test" выделить отдельно POST отдельно адрес, 2. отправить сразу на другой порт запрос и результат вызова вернуть в вызове readSocket
Snusmumriken
Это не post, это query : )
Валентин
ну на сервер это приходит как query, да но дальше надо отправлять же как пост
Snusmumriken
Упрощённый парсинг первой строки выглядит примерно так: local line = "POST /e1crdbg/rdbgTest?cmd=test" local request = {} local verb, tail = line:match("(%a+) (.*)") request.verb = verb request.location = tail:match("[^?#]*") request.query = tail:match("?([^#]*)")
Snusmumriken
Не надо query дальше отправлять как post, ибо там могут быть сильно разнородные данные.
Snusmumriken
Например, в query — кей-валуй, а в post — бинарь. Разве что на отдельные post-сущности делить.
Snusmumriken
А вот почти полноценный парсер URI выглядит примерно так: https://pastebin.com/GfetStTD
Snusmumriken
Надо чекнуть, распарсит ли он вот это вот: /e1crdbg/rdbgTest?cmd=test
Валентин
а разве пост часть урл? он же отдельно пришлепывается именно как команда в пересылаемом тексте
Snusmumriken
И ты хочешь пихать в XML кей-валуй из query?
Snusmumriken
Блин, а ведь у меня где-то есть паста обычного хттп-запроса через сокеты. https://pastebin.com/M57BZ3Je
Валентин
нет, смотри. есть чужой сервер он висит на порту 54321 и есть мой на поту 12345. Клиент подключается ко мне на порт 12345 и все что должен сделать мой прокси - просто переслать данные на другой порт, дождаться ответа и отправить назад (попутно записав в файл все что прошло и туда и обратно) Т.е. анализа передаваемого содержимого - не будет
Igor
Я такую штуку уже делал
Snusmumriken
Если так, то в целом всё проще.
Igor
Можно и без взаимодействия с HTTP обойтись
Snusmumriken
Ага
Snusmumriken
Просто читаем всё что послали в один сокет, и шлём в другое место.
Валентин
Можно и без взаимодействия с HTTP обойтись
я понимаю это, но не понял как это сделать. вот и пришлось думать через хттп
Igor
В моей штуке можно было и реврайт хедеров делать и тела запроса/ответа
Igor
Но сейчас я её уже вряд ли найду
Валентин
ну это не нужно, этим уже другая вещь будет заниматься
fgntfg
Запрос и датаграмму лучше сразу записывать.