|
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
|
![]()
Сообщение
#21
|
|
![]() Освоившийся участник ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 307 Регистрация: 11.7.2008 Пользователь №: 173 Спасибо сказали: 31 раз ![]() |
while и break While - Цикл, выполняется до тех пор, пока условие внутри него не равно false;break - Принудительно останавливает(обрывает) цикл; Код while 1 == 1 do - будет выполняться бесконечно т.к. 1 всегда равен 1(т.е. будет выводить Test 1 - до бесконечности)SendToAll("Test 1") end Код while 1 == 1 do Остановится, после того как встретит "break" т.е. данный код распечатает - "Test 1" 1 раз и больше ничего не сделает, даже не дойдет до распечатки "Test 2". break - Например, может использоваться если мы проходим по таблице в поиске какого-то значения и при его встречи не имеет смысла дальше теребить таблицу, тогда, мы прерываем цикл с его помощьюSendToAll("Test 1") break SendToAll("Test 2") end Цитата(district) if f then ммм...функция же возвращает значение, тогда же не выполняется - return Read(f) f:close() f:flush() end Цитата(district) f:close() f:flush() и ещё, у меня вопрос, а если написать Код if f then - то последующие операторы выполняются и вообще, допустим ли такой синтаксис? Если да, то, что произойдёт?))).
do return Read(f) end f:close() f:flush() end |
|
|
![]()
Сообщение
#22
|
|
![]() Постоялец ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз ![]() |
Sephiroth_Lukaw
Ясненько, хорошие примерчики, зенькую бардзо )) По поводу вчерашних мучений вот с этим: Код ValidateNickArrival(user,data) for i, tPermBan in pairs(frmHub:GetPermBanList()) do if user.sName == tPermBan.sName then Sender("Ломится забаненный по нику "..user.sName.." с IP [ "..user.sIP.." ] ... frmHub:GetPermBanList() возвращает ники ЗАРЕГАННЫХ юзеров Цитата Returns an array containing all registered users as PermBan objects. (если я правильно перевел эту фразу ![]() а у меня все забаненные автоматически удаляются из списка регов. Может, тут "собака порылась" ? Надо еще попробовать. |
|
|
![]()
Сообщение
#23
|
|
![]() RusHub team lead ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз ![]() |
Да! Это моя ошибка при проектировании скрипта, возникла из-за того, что я сначало не делал возврат значения в функции, а в конце написания вдруг сделал. А на самом деле должно быть так:
Код function GetNickAndIp(hFile) local f=io.open(hFile) if f then local a,b=Read(f) f:close() f:flush() return a,b end end Функцию GetNickForIp тоже подправил: Код function GetNickForIp(sIP,sFile)
local sMsg,tNicks,tIPs="*** Ники, с которых входил пользователь с IP адресом "..sIP,GetNickAndIp(sFile) if tIPs and tIPs[sIP] then for i,v in pairs(tIPs[sIP]) do sMsg=sMsg.."\n\t"..i.." - "..v end else sMsg="*** Пользователь с IP адресом "..sIP.." в базе не найден." end return sMsg end |
|
|
![]()
Сообщение
#24
|
|
![]() Постоялец ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз ![]() |
Сенкс, роем дальше!
![]() Но я уже простов восторге, это ж просто песня какая то: Цитата [17:23:35] <ConnectionsInspector> *** IP адреса, с которых входил пользователь с ником [hor]userko 93.80.110.160 - 2 раз(а) 78.106.203.73 - 1 раз(а) 78.106.170.114 - 3 раз(а) 78.106.194.170 - 2 раз(а) 93.81.230.134 - 5 раз(а) 78.106.197.255 - 1 раз(а) 93.80.110.31 - 1 раз(а) :dance: Setuper Ну вроде все работает, но осталось две проблемки. Крайний код GetNickAndIp(hFile) , приведенный тобой - увы, тоже не идет, Цитата attempt to use a closed file . Если никаких подводных камней нет, то, может, оставить так, как я привел выше? Глюков вроде нет, все работает.А вот вторая "проблемка" посерьезнее. Требуется изменение функции GetNickForIp(sIP,sFile) Дело вот в чем. (Видимо, я с самого начала несколько не до конца задачу сформулировал, ибо сам не представлял, как именно будет работать скрипт.) Допустим, мы пробиваем ники по айпи. Если айпи статический, то все прекрасно, скрипт показывает или один ник, если юзер порядочный, или несколько, если юзер "многоликий Янус". А вот если айпи динамический - то скрипт показывает только те ники, под которыми юзер заходил только с этого конкретного текущего айпи. А он мог заходить еще с пятидесяти айпи, и под другими никами. В таком случае вскрыть его многоликость не удается. Вот пример. Цитата [00:39:42] <ConnectionsInspector> *** Ники, под которыми входил пользователь с IP адресом 78.106.193.201 [sln]Vadim - 1 раз(а) с этого IP [00:40:02] <ConnectionsInspector> *** IP адреса, с которых входил пользователь с ником [sln]Vadim 93.80.223.24 - 2 раз(а) 93.81.185.195 - 3 раз(а) 93.80.207.15 - 1 раз(а) 93.81.184.77 - 2 раз(а) 93.80.204.133 - 1 раз(а) 93.81.159.168 - 2 раз(а) 93.81.186.103 - 1 раз(а) 93.81.153.71 - 1 раз(а) 93.80.234.47 - 1 раз(а) 93.81.184.134 - 1 раз(а) 78.106.193.201 - 1 раз(а) 95.24.54.46 - 1 раз(а) 93.80.240.107 - 2 раз(а) 93.80.233.3 - 3 раз(а) 95.24.59.143 - 1 раз(а) 93.80.244.196 - 1 раз(а) 93.80.208.174 - 1 раз(а) Можно тут что-нибудь сделать? ![]() |
|
|
![]()
Сообщение
#25
|
|
![]() RusHub team lead ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз ![]() |
да ты прав, я что-то не подумал, что если закрыть файл, то поток не передастся в качестве переменной.
Вот правильный код: Код function GetNickAndIp(hFile) local f=io.open(hFile) if f then local a,b=Read(f) f:close() f:flush() return a,b end end По поводу второй проблемы ничего сделать нельзя! Подумай сам, как однозначно идентифицировать пользователя? По какому параметру, если ip адрес динамический и ник меняется свободно. Допустим в сети несколько динамических ip адресов: 10.10.10.1 - 10.10.10.254. Пусть ip адреса арендуются пользователями, допустим на 1 день, и аренда ip адресов происходит по возрастанию последнего числа ip адреса. Пусть пользователь Вася сегодня арендовал ip адрес 10.10.10.1, а пользователь Петя, тоже сегодня (двумя минутами позже), арендовал ip адрес 10.10.10.2. Сегодня всё хорошо, но вот допустим завтра аренда ip адресов произошла наоборот (бывший Вася арендовал 10.10.10.2, бывший Петя арендовал 10.10.10.1) и допустим пользователи решили сменить ники (Вася(10.10.10.1) сменил ник на Вову(10.10.10.2), а Петя(10.10.10.2) сменил ник на Александра(10.10.10.1)). Теперь вопрос: кто под какими никами сидит на хабе? Если мы знаем, последовательность смены ников, но мы можем точно ответить, что мол Вася=Вова, а Петя=Александр. Но если мы не знаем, а мы точно не знаем, так как мы являемся третьей стороной и в смене ников не принимаем участия, то идентифицировать пользователей нельзя: может быть Вася=Александр, так как ip адрес Васи и Александра один и тот же - 10.10.10.1, а может быть Вася=Вова, так как ip адрес сменился. Это большая проблема однозначной идентификации пользователя. Если решить эту проблему, то, например, нельзя будет никаким способом избежать бана (что к сожалению сейчас можно делать), и можно будет привязывать статистику пользователя по этому параметру идентификации. Многие ищат решения проблемы среди всяких DNS имён, MAC адресов, CID номеров, но все эти параметры можно также изменить как и ник, как и ip. Поэтому идентификация пользователя является глобальной проблемой p2p сетей. |
|
|
![]()
Сообщение
#26
|
|
![]() Постоялец ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз ![]() |
Что ж, уже то, что есть - очень хорошее подспорье ))
Чуть попозже со всеми подшаманиваниями и растолковываниями специально для таких админов, которые "а чиво он ни работаед?" выложу его в готовых скриптах, если ты не против, конечно. Хочу попробовать саму функцию создания лога сюда еще добавить.. и может быть, даты входов как-то добавить.. в общем пока в раздумьях. |
|
|
![]()
Сообщение
#27
|
|
![]() Постоялец ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз ![]() |
В общем добавил я в Инспектор коннектов функцию самой записи лога, теперь полноценная Вещь в себе получилась
![]() Добавил еще и запись даты, на всякий случай. ---------------------------------------------------------------- Переприкреплен вариант с однократной очисткой памяти после запроса. (расход памяти потихоньку накапливается в процессе работы, в варианте однократной очистки. Если убрать СтопТаймер, очистка будет идти каждые несколько секунд и расход памяти будет поддерживаться на постоянном уровне)
Прикрепленные файлы
|
|
|
![]()
Сообщение
#28
|
|
![]() RusHub team lead ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз ![]() |
Почему не работает? Какую ошибку он выдаёт?
Твой код неправильный! Из-за него будет накапливаться неиспользуемая память, из-за того, что ты не закрываешь файл и не очищаешь входной поток. |
|
|
![]()
Сообщение
#29
|
|
![]() Постоялец ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз ![]() |
Setuper
Цитата attempt to use a closed file а в моем варианте память и правда накапливается. 5 мб - многовато для такого ботика. |
|
|
![]()
Сообщение
#30
|
|
![]() RusHub team lead ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз ![]() |
опять моя ошибка из-за невнимательности.
Вот этот код работает, я проверил: Код function GetNickAndIp(hFile) В чем разница увидел? local f=io.open(hFile) if f then local a,b=Read(f) f:flush() f:close() return a,b end end ![]() |
|
|
![]()
Сообщение
#31
|
|
![]() Постоялец ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз ![]() |
Увидел.
Действительно, работает, не вылетает. Но после первого же запроса расход памяти в "Нагрузке памяти скриптами" Птоки показывается как допустим 4600 кб и так и висит. Сразу по запуске скрипта расход составляет 55-60 кб В общем, не ощутил разницы с тем, что было. PS Размер самого лог-файла на текущий момент - 2.48 Мб. |
|
|
![]()
Сообщение
#32
|
|
![]() RusHub team lead ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз ![]() |
В луа существует автоматический уборщик. Если все файлы закрыты, то со временем ненужный мусор сам очистится.
|
|
|
![]()
Сообщение
#33
|
|
![]() Постоялец ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз ![]() |
Попробовал один банальный и известный вариант - вроде, работает. После отработки запроса через 3 сек импользуемая память очищается, и становится в пределах 170 кб.
Код function OnTimer() collectgarbage("collect") end function GetNickAndIp(hFile) local f=io.open(hFile) if f then local a,b=Read(f) f:flush() f:close() SetTimer(3*1000) --добавлено StartTimer() -- добавлено return a,b end end а потом падает до того значения, которое было при старте скрипта. |
|
|
![]()
Сообщение
#34
|
|
![]() RusHub team lead ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз ![]() |
Зачем мудрить что-то с таймером? Если хочешь принудительно собрать мусор, делай так:
Код function GetNickAndIp(hFile)
local f=io.open(hFile) if f then local a,b=Read(f) f:flush() f:close() collectgarbage("collect") return a,b end end |
|
|
![]()
Сообщение
#35
|
|
![]() Постоялец ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз ![]() |
-
|
|
|
![]()
Сообщение
#36
|
|
![]() Самый главный активист :-D ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз ![]() |
Может надо так:
Код function GetNickAndIp(hFile)
local f=io.open(hFile) if f then local a,b=Read(f) f:flush() f:close() return a,b end collectgarbage("collect") end |
|
|
![]()
Сообщение
#37
|
|
![]() RusHub team lead ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз ![]() |
2district: ппц... ты фигнёй страдаешь
2Wariner: сам подумай функция возвращает значение и твоя очистка никогда не будет выполняться. Раз уж на то пошло, то надо очищать в функции ChatArrival, но никак не таймером! Представляете, что вы каждый 3 секунды вызываете функцию очистки, а функция очистки достаточно сильно нагружает процессор)) |
|
|
![]()
Сообщение
#38
|
|
![]() Постоялец ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз ![]() |
-
|
|
|
![]()
Сообщение
#39
|
|
![]() RusHub team lead ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз ![]() |
а где ты его останавливаешь в упор не вижу
|
|
|
![]()
Сообщение
#40
|
|
![]() Постоялец ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз ![]() |
Тот набросок, с которого начался топик, вылился вот во что.
-Убрана функция автосканирования -Репорты получает только тот, кто непосредственно запускает проверку (ОП) -В репортах отсутствуют нормально законнектившиеся юзеры, не нарушающие технических правил хаба -В репортах присутствуют размер шары, слоты и хабы юзера(может, еще что-то можно добавить?), изменен принцип получения информации - теперь на период проверки технические правила хаба по слотам, мин шаре и макс хабам отменяются, по окончании - возвращаются на место. ВНИМАНИЕ! Возвращаемый на место параметр миншары сделан применительно к "Гб", т.е. если на вашем хабе миншара указана в Мб, то потребуются соответствующие изменения кода. -Добавлена блокировка перехвата процесса проверки другим ОПом. Смысл проверки: узнать, кто пытается войти, и почему именно не может. У меня это выглядит примерно так (см.картинку) Может, кому-нибудь пригодится такой бот.
Прикрепленные файлы
![]() ![]() |
|
|
![]() ![]() |
![]() |
Сейчас: 3.4.2025, 23:21 |