myDC.ru

Здравствуйте, гость ( Вход | Регистрация )

 
5 страниц V  < 1 2 3 4 > »   
Ответить в данную темуНачать новую тему

> Хаблисты

Enyby
сообщение 4.11.2009, 15:18
Сообщение #21


Освоившийся участник
*****

Группа: Пользователи
Сообщений: 391
Регистрация: 4.11.2009
Из: Дом
Пользователь №: 4 923
Спасибо сказали: 239 раз




Код
<?php
function lock2key($_LOCK) {

    $lockLength = strlen ($_LOCK);

    $h = ord($_LOCK{0}) ^ ord( $_LOCK{ $lockLength - 1} ) ^ ord( $_LOCK{ $lockLength - 2} ) ^ 5;
    while ($h > 255) {$h = $h - 256;}

    $h = (($h<<4) & 240) | (($h>>4) & 15);

    $a = $h;

    if ($a == '126' || // '~'
    $a == '124' || // '|'
    $a == '96' || // '`'
    $a == '36' || // '$'
    $a == '5' || // '^E'
    $a == '0') // NUL
    {
        $LockToKey = "/%DCN";

        if ($a < 100)
        $LockToKey .="0";
        if ($a < 10)
        $LockToKey .="0";
        $LockToKey .= $a;
        $LockToKey .= "%/";
    } else {
        $LockToKey = chr ($a);
    }

    for ($j = 1; $j < strlen($_LOCK); $j++) {
        $h = ord($_LOCK{$j}) ^ ord($_LOCK{$j-1});

        while ($h > 255) {$h = $h - 256;}

        $h = (($h<<4) & 240) | (($h>>4) & 15);
        $a = $h;

        if ($a == '126' || // '~'
        $a == '124' || // '|'
        $a == '96' || // '`'
        $a == '36' || // '$'
        $a == '5' || // '^E'
        $a == '0') // NUL
        {
            $LockToKey .= "/%DCN";

            if ($a < 100)
            $LockToKey .="0";
            if ($a < 10)
            $LockToKey .="0";
            $LockToKey .= $a;
            $LockToKey .= "%/";
        } else {
            $LockToKey .= chr ($a);
        }
    }

    return $LockToKey;
}

function process($sock, $str) {
//    echo "A: ".$str.'|'.PHP_EOL;
    socket_send($sock, $str.'|', strlen($str) + 1, NULL);
}

function checkHub($address, $port) {
    $nick = substr(md5(mt_rand(0, 100000)), 0, 10);
    $description = substr(md5(mt_rand(0, 100000)), 0, 10);
    $email = substr(md5(mt_rand(0, 100000)), 0, 10);
    $sharesize = mt_rand(10*1024, 20*1024)*mt_rand(1024*1024,2*1024*1024);
    $status = new stdClass();

    if ($fp=@fsockopen(htmlentities($address, ENT_QUOTES),$port,$ERROR_NO,$ERROR_STR,5))
    {
        fclose($fp);
        $status->online = true;
        $status->users = 0;

        $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        if (!socket_connect($socket, gethostbyname($address), $port)) {
            echo 'Ошибка: '.socket_strerror(socket_last_error());
            return;
        }
        $end = '';
        while ($buffer = socket_read($socket, 2048, PHP_BINARY_READ)) {
            $linie = explode('|', $end.$buffer);
            $size = sizeof($linie);
            for ($i = 0; $i < $size; ++$i) {
                if ($i + 1 == $size) {
                    $end = $linie[$i];
                    break;
                }
                $user = explode(' ', $linie[$i]);
//                echo "Q: ".$linie[$i].PHP_EOL;                
                switch($user[0]) {
                    case '$Hello':
//                        echo "Q: ".$linie[$i].PHP_EOL;
                        if ($user[1] == $nick) {
                            process($socket, '$Version 1,0091');
                            process($socket, '$GetNickList');
                            process($socket, '$MyINFO $ALL '.$nick.' '.$description.'<++ V:0.674,M:A,H:1/0/1,S:20>$ $LAN(T3).$'.$email.'$'.$sharesize.'$');
                        }                        
                        break;
                    case '$HubTopic':
//                        echo "Q: ".$linie[$i].PHP_EOL;    
                        $tmp = explode(' ', $linie[$i], 2);
                        $status->topic = $tmp[1];                                                
                        break;
                    case '$HubName':
//                        echo "Q: ".$linie[$i].PHP_EOL;    
                        $hubinfo = explode(' ', $linie[$i], 2);
                        $tmp = explode(' - ', $hubinfo[1], 2);
                        $status->name = $tmp[0];
                        $status->topic = (count($tmp) > 1) ? $tmp[1] : '';                                            
                        break;
                    case '$Lock':
//                        echo "Q: ".$linie[$i].PHP_EOL;
//                        process($socket, '$Supports NoGetINFO NoHello UserIP2 ');
                        process($socket, '$Key '.lock2key($user[1]));
                        process($socket, '$ValidateNick '.$nick);
                        break;
                    case '$NickList':
//                        echo "Q: ".$linie[$i].PHP_EOL;
                        $tmp = explode(' ', $linie[$i], 2);
                        $nicks = explode('$$', $tmp[1]);
                        $status->users = count($nicks);                        
                        break 3;
                        break;
                    case '$MyINFO':    
//                        echo "Q: ".$linie[$i].PHP_EOL;                    
                        if ($user[2] != $nick) {
                            $status->users++;
                        }
                        else {
                            break 3;
                        }
                        break;
                    default:
//                        echo "Q: ".$linie[$i].PHP_EOL;
                        break;
                }
            }
        }
        socket_close($socket);
    }
    else {
        $status->online = false;
    }
    return $status;
}

Простейший пингер на php. По сути полноценный ДС клиент, обрезаный не хило. Интересует специфиакация общения хабпингер - хаб. Ибо после $BotINFO мне рвут соединение без какого-либо ответа.


Спасибо сказали:
Go to the top of the page
+Quote Post
alex82
сообщение 5.11.2009, 11:15
Сообщение #22


Местный
*******

Группа: Неактивированные
Сообщений: 908
Регистрация: 26.12.2008
Пользователь №: 1 574
Спасибо сказали: 1406 раз




Цитата
Ибо после $BotINFO мне рвут соединение без какого-либо ответа.

Так и должно быть. Только перед отключением хаб должен отправить команду $HubInfo с информацией о хабе, но только в том случае, если ты не забыл указать в $Supports поддержку $BotInfo/$HubInfo.


Спасибо сказали:
Go to the top of the page
+Quote Post
Setuper
сообщение 5.11.2009, 12:30
Сообщение #23


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Кстати, это зависит от хаба. Некоторые закрывают соединение, а некоторые нет))
Go to the top of the page
+Quote Post
Enyby
сообщение 5.11.2009, 14:04
Сообщение #24


Освоившийся участник
*****

Группа: Пользователи
Сообщений: 391
Регистрация: 4.11.2009
Из: Дом
Пользователь №: 4 923
Спасибо сказали: 239 раз




Спасибо, помогло. Неплохо бы указать это в теме описания протокола, ибо там я ничего про эту характеристику не нашел.
Go to the top of the page
+Quote Post
Setuper
сообщение 5.11.2009, 18:56
Сообщение #25


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Добавил в описание протокола.
Go to the top of the page
+Quote Post
HackFresse
сообщение 6.11.2009, 10:49
Сообщение #26


Продвинутый участник
****

Группа: Пользователи
Сообщений: 155
Регистрация: 11.1.2009
Пользователь №: 1 772
Спасибо сказали: 29 раз




Цитата
Вопросы по порядку:

1. Народ, кто знает какие хаблисты, акромя знаменитого dchublist.ru?
2. Какие функции нужны публичному хаблисту?
3. Что если нам сделать свой хаблист?
4. Как думаете, это трудно? big_smile.gif
5. Кто поможет?))
6. Я совсем спятил?


1. не знаю, да и не искал особо.
2. тут надо пофантазировать на тему "а круто бы было, если бы..", а потом к этому списку применить "а надо ли оно вообще такое"
3. можно. или кто-то запретил? )
4. мне кажется, тут придумать и продумать функции - основная задача..
5. чем смогу- помогу. а могу немного MySql, php, jQuery, ajax.
6. ммм... не знаю big_smile1.gif
Go to the top of the page
+Quote Post
Enyby
сообщение 6.11.2009, 14:06
Сообщение #27


Освоившийся участник
*****

Группа: Пользователи
Сообщений: 391
Регистрация: 4.11.2009
Из: Дом
Пользователь №: 4 923
Спасибо сказали: 239 раз




Мне кажется, HackFresse, что ты не читал пост #21. Там написан код PHP, который обеспечивает получение с хаба его названия, топика и количество народа, на нем присутствующего. После небольших изменений можно считать и шару, только это будет достаточно медленно. Поэтому ответы на вопросы 3 и 4 уже есть.
Go to the top of the page
+Quote Post
PomanoB
сообщение 6.11.2009, 21:36
Сообщение #28


AmxModx Scripter
*****

Группа: Пользователи
Сообщений: 302
Регистрация: 2.12.2008
Из: Королев
Пользователь №: 1 283
Спасибо сказали: 127 раз




Помойму делать отдельно пингер смысла нету, так как он получает не самую важную информацию, пользователям важнее какая сейчас на хабе шара и сколько там народу, надо сразу делать обходчик как клиента, что бы он считал шару и пользователей, и делать его на php - не самый лучший вариант
Go to the top of the page
+Quote Post
Enyby
сообщение 6.11.2009, 23:22
Сообщение #29


Освоившийся участник
*****

Группа: Пользователи
Сообщений: 391
Регистрация: 4.11.2009
Из: Дом
Пользователь №: 4 923
Спасибо сказали: 239 раз




Отлично. Мне вот только интересно на чем, и как ты это забросишь на хостинг?

PS Приведенный выше код позволяет считать пользователей, получать общую шару, мотд топик и т. д. возможности практически безграничные.

PPS Пробовал реализовать на неблокирующих сокетах, но ничего хорошоего не вышло, да и, в добавок, грузит процеесор под самую завязку.
Go to the top of the page
+Quote Post
mariner
сообщение 6.11.2009, 23:47
Сообщение #30


Местная ТехПоддержка
**********

Группа: Администраторы
Сообщений: 1 875
Регистрация: 18.7.2008
Из: Моск. Обл, г. королев, район Болшево
Пользователь №: 221
Спасибо сказали: 220 раз




perl & python?
Go to the top of the page
+Quote Post
Enyby
сообщение 6.11.2009, 23:49
Сообщение #31


Освоившийся участник
*****

Группа: Пользователи
Сообщений: 391
Регистрация: 4.11.2009
Из: Дом
Пользователь №: 4 923
Спасибо сказали: 239 раз




Тогда в чем проблема? Я вроде видел где-то тут на перле такого рода чудо.
Go to the top of the page
+Quote Post
Setuper
сообщение 7.11.2009, 0:10
Сообщение #32


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Согласен с Романовым, а забрасывается на хостинг по средствам бд. Пишем программу, которая делает обход серваков со скидывание инфы в бд, а из бд уже можно хоть куда эту инфу поместить или использовать в каких-либо других целях. В итоге, не ограниченные возможности, достаточно быстро и не нагрузочно.

По поводу неблокирующих сокетов, то процессор грузится на 100% вероятнее всего из-за того, что стоит маленькая задержка между циклами. Когда нагрузки на сервер нет никакой, он концентрируется на обрабатывании огромного числа циклов, что и приводит к загрузке процессора.
Go to the top of the page
+Quote Post
Enyby
сообщение 7.11.2009, 0:14
Сообщение #33


Освоившийся участник
*****

Группа: Пользователи
Сообщений: 391
Регистрация: 4.11.2009
Из: Дом
Пользователь №: 4 923
Спасибо сказали: 239 раз




Тогда вообще можно не корячится. Где-то постоянно работает грейлинк или другой дс в поддержкой LUA, на нем крутится скрипт который по таймеру в MySQL складывает информацию и все.
Go to the top of the page
+Quote Post
Setuper
сообщение 7.11.2009, 0:18
Сообщение #34


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Думаю использование клиента с различными прибамбасами тоже не лучший вариант, тем более за эту работу опять же отвечает скрипт, что опять же не есть хорошо в смысле нагрузок, да и вообще стабильной работы.
Go to the top of the page
+Quote Post
Enyby
сообщение 7.11.2009, 1:09
Сообщение #35


Освоившийся участник
*****

Группа: Пользователи
Сообщений: 391
Регистрация: 4.11.2009
Из: Дом
Пользователь №: 4 923
Спасибо сказали: 239 раз




По-моему это лучше чем писать свой DC. Тем более от скрипта зависят совсем не критичные данные, так что не вижу тут проблемы.
Go to the top of the page
+Quote Post
Enyby
сообщение 8.11.2009, 13:06
Сообщение #36


Освоившийся участник
*****

Группа: Пользователи
Сообщений: 391
Регистрация: 4.11.2009
Из: Дом
Пользователь №: 4 923
Спасибо сказали: 239 раз




Цитата(Setuper @ 6.11.2009, 23:10) *
По поводу неблокирующих сокетов, то процессор грузится на 100% вероятнее всего из-за того, что стоит маленькая задержка между циклами. Когда нагрузки на сервер нет никакой, он концентрируется на обрабатывании огромного числа циклов, что и приводит к загрузке процессора.


Спасибо. Разобрался, теперь все работает раз в 15 быстрее.
Go to the top of the page
+Quote Post
Accelerator
сообщение 20.4.2010, 16:10
Сообщение #37


Developer
******

Группа: Модераторы
Сообщений: 541
Регистрация: 11.11.2008
Пользователь №: 1 075
Спасибо сказали: 244 раза




Цитата(Enyby @ 4.11.2009, 18:18) *

Спасибо за пингер! big_smile.gif Но есть парочка вопросов: как к нему добавить определение на какой программе работает хаб(Например: PtokaX) и кол-во текущей шары на указанном хабе?
Go to the top of the page
+Quote Post
Enyby
сообщение 20.4.2010, 17:11
Сообщение #38


Освоившийся участник
*****

Группа: Пользователи
Сообщений: 391
Регистрация: 4.11.2009
Из: Дом
Пользователь №: 4 923
Спасибо сказали: 239 раз




Вариантов два. Первый - использовать через некоторое время функцию пингера (смотри функцию протокола $BotINFO), второй - неявный, программу смотреть по ключу присылаемому для проверки, в большинстве случаев он специфичный для каждого хаба, а общую шару считать вручную через получение всех $MyINFO пользователей через $GetNickList и последующего сложения. Сразу скажу, что совсем не обязательно что на одного пользователя придет одно $MyINFO, есть скрипты пытающиеся переопределить какие-то значения, поэтому приходят несколько $MyINFO на одного пользователя. Я использовал для этого map массив.
Go to the top of the page
+Quote Post
Accelerator
сообщение 20.4.2010, 17:28
Сообщение #39


Developer
******

Группа: Модераторы
Сообщений: 541
Регистрация: 11.11.2008
Пользователь №: 1 075
Спасибо сказали: 244 раза




Уже пробывал это делать самостоятельно, никак не могу это всё вытянуть :( . Можешь код кинуть, если не жалко?
Go to the top of the page
+Quote Post
Enyby
сообщение 20.4.2010, 17:34
Сообщение #40


Освоившийся участник
*****

Группа: Пользователи
Сообщений: 391
Регистрация: 4.11.2009
Из: Дом
Пользователь №: 4 923
Спасибо сказали: 239 раз




Полный код я давать не буду. Дам часть, только боюсь что он вырван из контекста и многое не будет понятно. К слову программу я определяю именно через $BotInfo, а шару через получение списка.

Код
case '$HubINFO':
                        $hubinfo = explode(' ', $linie[$i], 2);
                        $tmp = explode('$', $hubinfo[1]);
                        $hub['online'] = 2;
                        $hub['name'] = $tmp[0];
                        $hub['address'] = $tmp[1];
                        $hub['description'] = $tmp[2];
                        $hub['maxusers'] = $tmp[3];
                        $hub['minshare'] = $tmp[4];
                        $hub['minslots'] = $tmp[5];
                        $hub['maxhubs'] = $tmp[6];
                        $hub['type'] = $tmp[7];
                        $hub['admin'] = $tmp[8];

Код
                    case '$MyINFO':
                        $hub['MyINFO'] = true;
                        if ($user[2] != $hub['me']->nick) {
                            $tmp = explode('$', $linie[$i]);
                            if(!isset($hub['users'][$user[2]]))
                            $hub['share'] += $tmp[count($tmp) - 2];
                            $hub['users'][$user[2]] = '';
                        }
                        break;


Спасибо сказали:
Go to the top of the page
+Quote Post

5 страниц V  < 1 2 3 4 > » 
Ответить в данную темуНачать новую тему
7 чел. читают эту тему (гостей: 7, скрытых пользователей: 0)
Пользователей: 0

Collapse

> Похожие темы

  Тема Ответов Автор Просмотров Последнее сообщение
No New Posts От: Хаблисты
От темы с ID: 5075
2 feardc 4 456 30.4.2016, 12:07 Посл. сообщение: feardc
No New Posts Topic has attachmentsХаблисты
Некоторое количество хаблистов
9 Enyby 11 792 17.12.2011, 2:46 Посл. сообщение: Enyby
No New Posts От: Хаблисты
От темы с ID: 404
0 absent 3 626 30.11.2010, 1:40 Посл. сообщение: absent
No New Posts От: Хаблисты
От темы с ID: 404
0 Accelerator 4 482 21.4.2010, 6:47 Посл. сообщение: Accelerator
No New Posts Хаблисты
1 KamoK 6 047 1.12.2009, 11:54 Посл. сообщение: Артём

 



RSS Сейчас: 27.11.2024, 3:34