OpenReactor 29 Опубликовано: 15 августа, 2021 local soc = require("internet") soc:write("MOTD") motd = soc:read(100) Всё роботает. А если я еще раз запрошу MOTD то или ошибка или ничего. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
whiskas 144 Опубликовано: 15 августа, 2021 (изменено) Хотелось бы узнать ошибку. Изменено 15 августа, 2021 пользователем whiskas 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp 4 409 Опубликовано: 16 августа, 2021 Это весь код? motd — это глобалка? Исходя из чего было установлено, что оно работает? И как оно в принципе работать может, когда в либе internet функции write подавно нету и не было никогда? Когда вместо ответа приходится задать кучу встречных вопросов, должно настораживать. 1 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
OpenReactor Автор вопроса 29 Опубликовано: 16 августа, 2021 (изменено) 8 часов назад, Fingercomp сказал: Это весь код? motd — это глобалка? Исходя из чего было установлено, что оно работает? И как оно в принципе работать может, когда в либе internet функции write подавно нету и не было никогда? Когда вместо ответа приходится задать кучу встречных вопросов, должно настораживать. local soc = require("internet") soc.open("localhost", 2888) soc:write("MOTD") motd = soc:read(100) Я хочу допустим запросить motd ещё раз то я получу nill soc:write("MOTD") motd = soc:read(100) Изменено 16 августа, 2021 пользователем OpenReactor 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp 4 409 Опубликовано: 16 августа, 2021 Я задал 4 вопроса и ни на один не получил вразумительного ответа. А они мне нужны, потому что без них совершенно неясно, "как это пофиксить". За других говорить не могу и не буду. Но я не атакую встречными вопросами из-за вредности, злости (ну, если немного только) или чувства собственного величия. Наоборот, иногда пытаюсь угадать по неполной информации ответ, что, вообще говоря, не надо делать. Здесь я бессилен. Что творится, никто не понимает. Задаю вопросы — прояснения не получаю. К слову. Для оформления кода есть кнопка . Просьба ею пользоваться. Можно даже выбрать подсветку Lua, если настроение очень щедрое. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS 1 903 Опубликовано: 17 августа, 2021 14 часа назад, OpenReactor сказал: Я хочу допустим запросить motd ещё раз то я получу nill soc:write("MOTD") motd = soc:read(100) Сокет-сервак работает параллельно с твоим клиентом, пишущим MOTD и ждущим ответа. Клиентские данные могли не успеть обработаться серваком во второй раз, могли проинтерпретироваться в виде сдублированной строки "MOTDMOTD", а могли и вовсе быть поглощены ZOGом во имя вселенского благополучия. Ты же делаешь :read() в слепой надежде на успех. Непорядок! Подписывайся на ивент internet_ready, делай небольшую задержку между отправкой запросов на MOTD, разбивай сообщения через символ переноса строки, правильно обрабатывай их на сервере, а затем уже читай данные: local soc = require("internet") local event = require("event") event.listen("internet_ready", function() local motd = soc:read(100) ... end) soc.open("localhost", 2888) soc:write("MOTD\r\n") os.sleep(1) soc:write("MOTD\r\n") os.sleep(1) ... Либо, если оч сложна, юзай костыль со слипом. Но тут тоже никаких гарантий, то данные пришли и обработались корректно: local soc = require("internet") soc.open("localhost", 2888) soc:write("MOTD") os.sleep(1) motd = soc:read(100) soc:write("MOTD") os.sleep(1) motd = soc:read(100) ... 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 154 Опубликовано: 17 августа, 2021 @ECS О какой библиотеке идёт речь? Стандартная библиотека в составе OpenOS не может корректно работать с таким кодом. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS 1 903 Опубликовано: 17 августа, 2021 1 час назад, eu_tomat сказал: О какой библиотеке идёт речь? Стандартная библиотека в составе OpenOS не может корректно работать с таким кодом. Это особо и не важно, т.к. отсылающий код взят у топикстартера, а запись в сокет, судя по всему, у него работает. Либо это кастомная интернет-либа, либо код выложен не полностью, пофигу. Главное - дать наводку на листенер internet_ready 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
OpenReactor Автор вопроса 29 Опубликовано: 20 августа, 2021 В 17.08.2021 в 11:03, ECS сказал: могли проинтерпретироваться в виде сдублированной строки "MOTDMOTD" Да так и случилось. Осталось найти решение. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS 1 903 Опубликовано: 21 августа, 2021 В 20.08.2021 в 22:12, OpenReactor сказал: Осталось найти решение Сокет-сервак в режиме ресивера работает по накопительному принципу, и сообщения крайне часто будут стоять в буфере друг за дружкой, ожидая обработки, эт нормально. Высокоуровневые библиотеки решают эту проблему через протоколы прикладного уровня по OSI, а ты работаешь с "чистым" сокетом, поэтому придётся минимально пораскинуть мозгами Решений несколько: можно на клиенте перед отсылкой пакета добавлять в начало байт-префикс с длиной содержимого, а на сервере читать накопившийся результат, основываясь на принятых длинах пакетов. Если этот вариант слишком сложен или избыточен (например, если твой софт передает преимущественно короткие сообщения-команды), то можно попросту разделять пакеты любым спец. символом - обычно в сокет-чатах используют символ перевода строки \n 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
OpenReactor Автор вопроса 29 Опубликовано: 21 августа, 2021 (изменено) 2 минуты назад, ECS сказал: Сокет-сервак в режиме ресивера работает по накопительному принципу, и сообщения крайне часто будут стоять в буфере друг за дружкой, ожидая обработки, эт нормально. Высокоуровневые библиотеки решают эту проблему через протоколы прикладного уровня по OSI, а ты работаешь с "чистым" сокетом, поэтому придётся минимально пораскинуть мозгами Решений несколько: можно на клиенте перед отсылкой пакета добавлять в начало байт-префикс с длиной содержимого, а на сервере читать накопившийся результат, основываясь на принятых длинах пакетов. Если этот вариант слишком сложен или избыточен (например, если твой софт передает преимущественно короткие сообщения-команды), то можно попросту разделять пакеты любым спец. символом - обычно в сокет-чатах используют символ перевода строки \n Сервер то не мой. Ладно тогда время кастылей) Изменено 21 августа, 2021 пользователем OpenReactor 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS 1 903 Опубликовано: 21 августа, 2021 Только что, OpenReactor сказал: Сервер то не мой. Ладно тогда время кастылей) Дык попробуй отослать MOTD\r\n или MOTD\n, в 90% случаев серваки должны адекватно проинтерпретировать сообщение, если это прям не лютый кастом 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
OpenReactor Автор вопроса 29 Опубликовано: 21 августа, 2021 Только что, ECS сказал: Дык попробуй отослать MOTD\r\n или MOTD\n, в 90% случаев серваки должны адекватно проинтерпретировать сообщение, если это прям не лютый кастом Оки. Спасибо завтра попробую отпишу. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
local soc = require("internet")
soc:write("MOTD")
motd = soc:read(100)
Всё роботает. А если я еще раз запрошу MOTD то или ошибка или ничего.
Поделиться сообщением
Ссылка на сообщение
Поделиться на других сайтах