Перейти к содержимому
  • 0
OpenReactor

Как это пофиксить?

Вопрос

local soc = require("internet")

soc:write("MOTD")

motd = soc:read(100)

Всё роботает. А если я еще раз запрошу MOTD то или ошибка или ничего.

 

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


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

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

Хотелось бы узнать ошибку.

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

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


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

Это весь код? motd — это глобалка? Исходя из чего было установлено, что оно работает? И как оно в принципе работать может, когда в либе internet функции write подавно нету и не было никогда?

 

Когда вместо ответа приходится задать кучу встречных вопросов, должно настораживать.

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


Ссылка на сообщение
Поделиться на других сайтах
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)

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

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


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

Я задал 4 вопроса и ни на один не получил вразумительного ответа. А они мне нужны, потому что без них совершенно неясно, "как это пофиксить".

 

За других говорить не могу и не буду. Но я не атакую встречными вопросами из-за вредности, злости (ну, если немного только) или чувства собственного величия. Наоборот, иногда пытаюсь угадать по неполной информации ответ, что, вообще говоря, не надо делать. Здесь я бессилен. Что творится, никто не понимает. Задаю вопросы — прояснения не получаю.

 

К слову. Для оформления кода есть кнопка VQXNQyJ.png. Просьба ею пользоваться. Можно даже выбрать подсветку Lua, если настроение очень щедрое.

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


Ссылка на сообщение
Поделиться на других сайтах
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)
...

 

 

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


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

@ECS О какой библиотеке идёт речь? Стандартная библиотека в составе OpenOS не может корректно работать с таким кодом.

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


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

О какой библиотеке идёт речь? Стандартная библиотека в составе OpenOS не может корректно работать с таким кодом.

Это особо и не важно, т.к. отсылающий код взят у топикстартера, а запись в сокет, судя по всему, у него работает. Либо это кастомная интернет-либа, либо код выложен не полностью, пофигу. Главное - дать наводку на листенер internet_ready

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


Ссылка на сообщение
Поделиться на других сайтах
В 17.08.2021 в 11:03, ECS сказал:

могли проинтерпретироваться в виде сдублированной строки "MOTDMOTD"

 

Да так и случилось. Осталось найти решение.

 

image.thumb.png.199786543de3cdd840023ff621d6d9dc.png

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


Ссылка на сообщение
Поделиться на других сайтах
В 20.08.2021 в 22:12, OpenReactor сказал:

Осталось найти решение

Сокет-сервак в режиме ресивера работает по накопительному принципу, и сообщения крайне часто будут стоять в буфере друг за дружкой, ожидая обработки, эт нормально. Высокоуровневые библиотеки решают эту проблему через протоколы прикладного уровня по OSI, а ты работаешь с "чистым" сокетом, поэтому придётся минимально пораскинуть мозгами

 

Решений несколько: можно на клиенте перед отсылкой пакета добавлять в начало байт-префикс с длиной содержимого, а на сервере читать накопившийся результат, основываясь на принятых длинах пакетов. Если этот вариант слишком сложен или избыточен (например, если твой софт передает преимущественно короткие сообщения-команды), то можно попросту разделять пакеты любым спец. символом  - обычно в сокет-чатах используют символ перевода строки \n

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


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

Сокет-сервак в режиме ресивера работает по накопительному принципу, и сообщения крайне часто будут стоять в буфере друг за дружкой, ожидая обработки, эт нормально. Высокоуровневые библиотеки решают эту проблему через протоколы прикладного уровня по OSI, а ты работаешь с "чистым" сокетом, поэтому придётся минимально пораскинуть мозгами

 

Решений несколько: можно на клиенте перед отсылкой пакета добавлять в начало байт-префикс с длиной содержимого, а на сервере читать накопившийся результат, основываясь на принятых длинах пакетов. Если этот вариант слишком сложен или избыточен (например, если твой софт передает преимущественно короткие сообщения-команды), то можно попросту разделять пакеты любым спец. символом  - обычно в сокет-чатах используют символ перевода строки \n

Сервер то не мой. Ладно тогда время кастылей)

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

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


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

Сервер то не мой. Ладно тогда время кастылей)

Дык попробуй отослать MOTD\r\n или MOTD\n, в 90% случаев серваки должны адекватно проинтерпретировать сообщение, если это прям не лютый кастом

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


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

Дык попробуй отослать MOTD\r\n или MOTD\n, в 90% случаев серваки должны адекватно проинтерпретировать сообщение, если это прям не лютый кастом

Оки. Спасибо завтра попробую отпишу.

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


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

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

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

Гость
Ответить на вопрос...

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

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

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

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

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


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