Вероятно в старых версиях FlylinkDC++ (заметил на build 9474) был глюк и запрос к DHT Bootstrap шел каждую секунду.
а в новых я наверно зря user agent-а выкинул.
Вопрос - в php вообще есть возможность создание глобального объекта в памяти - типа хэш-мапы
чтобы он жил все время и был виден между коннектами с разных сессий?
Добавлено: 02 апр 2014, 16:14
HackFresse
нагородить можно много чего, вопрос целесообразности.
не нужно зацикливаться на мелких технических нюансах, тут нужно от бОльшего уже переходить к мелочам, а никак не наоборот
— передача настоящего CID, позволяющая однозначно идентифицировать одного и того же клиента на любом хабе (в NMDC иллюзия CID генерируется на стороне клиента хешем НИК+АДРЕС_ХАБА), от этого появляются плюшки вроде единого личного чата между собеседниками для всех хабов и т.д.
Т.е. теперь схема работы такая:
1) Если в глобальных настройках CID не задан принудительно вручную, то генерим его (массив каких-то рандомных значений, из которых получается строка в base32 длиной в 39 символов) и записываем в глобальные настройки.
2) Сохранённое значение используем на всех хабах вне зависимости от протоколов, хабов и ников.
3) CID меняется только в случае изменения глобальной настройки (обнуление значения или ручная правка юзером), при перезапуске клиента CID остаётся прежним.
всё верно?
Добавлено: 23 апр 2014, 19:35
flylinkdc
Да. CID остается всегда один. генерируется он снова только если его сотрут в конфиг файле руками в FAR-е
т.к. в GUI замены этого параметра нет
Добавлено: 30 апр 2014, 12:07
HackFresse
А как часто дц-клиент обращается к dht-серверу?
При загрузке/включении dht-сети, чтобы забрать первоначальный список других участников -- понято, а дальше?
Т.е. при сценарии "утром включили дц-клиента с активным dht-функционалом, и не выключали до позднего вечера" -- сколько раз и в каких случаях дц-клиент обратится к дхт-серверу?
Добавлено: 30 апр 2014, 14:24
flylinkdc
Есть таймер секундный
void TaskManager::on(TimerManagerListener::Second, uint64_t aTick) noexcept
BootstrapManager::getInstance()->process() "выталкивает" один элемент из массива полученных нод
если их становится = 0 то идет снова обращение к dht-серверу.
aTick - lastBootstrap > 15000 - т.е. гарантированно каждые 15 сек обрабатывается одна нода.
DHT_K - зашита и равна 10
я залогирую детально эту всю часть чтобы можно было посмотреть как и что шлется..
Добавлено: 30 апр 2014, 19:07
HackFresse
При загрузке дц-клиента взяли 50 каких-то нод, начали перебирать их по-очереди (делать попытки подключаться).
Если к какой-то ноде из бутстрап-списка подключиться не удалось -- удаляем её из внутреннего списка dht-нод,
иначе если от удалённой ноды получен список других нод - добавляем их все в общий список dht-нод.
Обходим по таймеру все записи в dht-таблице (проверка активности нод), если не осталось ни одной активной -- идём к бутстрап-серверу?
Добавлено: 30 апр 2014, 19:50
flylinkdc
Да, что-то вроде такого.
Добавлено: 01 май 2014, 00:04
HackFresse
А можно сделать обращение к бутстрап-серверу более частым?
Когда у клиента количество активных нод ниже какого-то минимального значения (но обращения 1 раз в n минут, чтобы не зацикливался).
Как бутстрап-сервер узнает, какие из отдаваемых им dht-нод актуальны?
Пока только по обращениям за первоначальным xml-списком (ты запросил список == ты активная нода), а это не очень точные и верные данные.
Запросить список я мог неделю назад, у меня IP уже 5 раз менялся, но из-за достаточно большого количества известных нод (найденных самостоятельно) к бутстрап-серверу я уже не обращусь и никак ему не скажу, что я очень даже активная нода, но с другим IP.
А сервер будет выдавать всем новеньким устаревшую инфу.
Добавлено: 16 май 2014, 09:20
flylinkdc
В базе накопилось много старых записей.
SELECT * FROM `dhtInfo` WHERE dht_time < DATE_ADD(NOW(), INTERVAL -10 DAY)
11 тыщ записей.
Куда правильнее такой удалятор засунуть
в сам скрипт никак нельзя? чтобы не связываться с хроном?
Как в php сделать код - чтобы он срабатывал один раз в сутки?
Добавлено: 16 май 2014, 22:18
Chavy
flylinkdc писал(а):Как в php сделать код - чтобы он срабатывал один раз в сутки?
В файлик или базу записать текущее время. После при каждом заходе посетителя на сайт сверять записанное в файл время с текущим. Если прошло более суток, попробовать установить лок на файл. Если лок установился - записывать в файл текущее время и выполнить требуемый код. Лок на файл гарантирует что скрипт запустится один раз.
тут явно что-то не доделано.
HackFresse - что скажешь?
Добавлено: 06 июн 2014, 10:24
flylinkdc
Еще вопрос по апачу
я хочу залочить доступ к dht клиенту определенной версии - 9474 билд
В нем наверное где-то ошибка и обращение к серверы идет очень часто
2. На стороне сервера добавил вот такой кусок удаляющий по ключу CID+IP
проверку по IP я добавил чтобы нельзя было удалить из базы данные с другого хоста (CID ведь можно подделать в URL-е)
хотя тут может и зря защитился
if (isset($_GET["stop"]))
{
$query = "delete FROM $data_table WHERE cid = '$cid' and ip = '$host'";
$result = mysql_query($query, $connect) or die(mysql_error());
mysql_close($connect);
die("Shutdown OK!");
}
Критикуйте?
Мне не понятно почему этой операции не было сделано в оригинальном StrongDC++
и клиент не сообщал серверу о том что он выключается..
Без нее ведь база достаточно быстро будет пухнуть.
Или тут в чем-то другом причина и нужно хранить мертвых клиентов?
Добавлено: 06 июн 2014, 13:35
HackFresse
Дополнительный запрос куда-то в интернеты при закрытии клиента?
Процесс флайлинка и так совсем недавно долго и упорно висел в памяти после закрытия клиента (проблема точно решена?), добавлять еще время на дополнительный запрос.. лично я бы не стал
Вот есть на хабах проблема с зомби-коннектами, когда у анрегов при некорректном отвале соединения с хабом конфликт имён случается.
Моргнул интернет, а хаб всё равно держит сокет открытым и думает, что клиент активен и просто не шлёт никаких данных.
Так и дхт-клиент, он может не стучаться к серверу, потому что ему в данный момент от сервера ничего не нужно, и еще потому, что интернетов у него нету/поменялись. Или убит процесс вовсе.
HackFresse писал(а):А можно сделать обращение к бутстрап-серверу более частым?
Когда у клиента количество активных нод ниже какого-то минимального значения (но обращения 1 раз в n минут, чтобы не зацикливался).
Как бутстрап-сервер узнает, какие из отдаваемых им dht-нод актуальны?
Пока только по обращениям за первоначальным xml-списком (ты запросил список == ты активная нода), а это не очень точные и верные данные.
Запросить список я мог неделю назад, у меня IP уже 5 раз менялся, но из-за достаточно большого количества известных нод (найденных самостоятельно) к бутстрап-серверу я уже не обращусь и никак ему не скажу, что я очень даже активная нода, но с другим IP.
А сервер будет выдавать всем новеньким устаревшую инфу.
Добавлено: 06 июн 2014, 13:47
flylinkdc
HackFresse писал(а):Дополнительный запрос куда-то в интернеты при закрытии клиента?
могу таймаут поставить 1 сек.
процесс флая висел долго у тебя? можешь повторить или опиши условия?
Считаю что обращение к dht-серверу при закрытии клиента необходимо чтобы удалить из таблицы заведомо мертвый IP-port
Добавлено: 06 июн 2014, 14:52
HackFresse
процесс флая висел долго у тебя? можешь повторить или опиши условия?
Если дц-клиент будет сообщать о своей активности только в случае отсутствия у него локального списка dht-нод, и пытаться сообщать о своей неактивности только при закрытии -- будут ли все ноды в таблице актуальными ?
Добавлено: 10 июн 2014, 20:47
flylinkdc
В 61 бетку добавил возможность включить логирование DHT http://www.fly-server.ru/install/r5xx/src-bin/
Можно посмотреть что и как пересылается - возможно заметите баги/не оптимальности
пишите
Идея алгоритма
1. новые версии флалинков после активации DHT отсылают запрос на тест UDP порта
если с внешнего сервера прошел ответный пакет UDP пакет по DHT порту то флай шлет на DHT сервер
запрос вида /dcDHT.php?cid=VTLZXAUSQMNMHKGWO3SIH3ZG3ZAUDXY5VKVGKWY&encryption=1&u4=17582&live=1
2. После завершение DHT менеджера - идет запрос такой
/dcDHT.php?cid=VTLZXAUSQMNMHKGWO3SIH3ZG3ZAUDXY5VKVGKWY&encryption=1&u4=17582&stop=1
3. Всем клиентам возвращается пачка узлов у которых поле live=1 т.е. мы гарантированно возвращаем IP:Port где прошел тест на доступность во внешний инет + узел еще включен (есть процент вероятности что он выключился аварийно но тут я пока не придумал как лучше)
может переодически слать "маркер жизни"...
история о том, как поломать совместимость и игнорить всех клиентов старых версий
"Не обновился на r503-beta99 build 100500 -- никакая ты не DHT-нода. и пока не обновишься до самой последней дебаг-версии -- не попасть тебе в список. А в списке dht-узлов будут только те, кто последнюю тестовую версию поставил"
Добавлено: 23 июн 2014, 14:08
flylinkdc
Данный код уже влит в релизную ветку.
ноды будут раздаваться всем клиентам - даже старым
только их список теперь будет актуальный
будут отдаваться только те, кто сидят на новых клиентах с открытыми DHT портами.
а остальные ноды (даже старые) найдутся уже без DHT сервера..