Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

MyDC.ru _ Ваши проекты _ Свой Dc++ Клиент

Автор: Kinjal 4.3.2009, 0:25

Всем привет.

Пару дней назад появилось желание написать свой клиент, отличный от стронга и его клонов(в том числе визуально, по меню настроек, и даже в используемом языке программирования :-)). Немного урезанный по функциональности(в стронге достаточно функций которыми я не пользуюсь), но и со своими фишками.

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

Ну и прикладываю скриншот(на нем - законченная серверная часть(client<->hub)), чтобы показать, что разговор не на пустом месте, а есть определенные наработки.

 

Автор: Setuper 4.3.2009, 0:30

Нет ли желания у автора сделать консольную версию клиента? В этом случае и дизайнера не нужно будет искать, и актуальная программа получится. Хотя можно сделать и консольную версию и версию с GUI.

Автор: Kinjal 4.3.2009, 2:39

Ну эм, консольную сделать так то не сложно, вот только не пойму зачем?

Автор: mariner 4.3.2009, 10:09

для работы как служба. на файловом сервенре. тут как бэ все ясно

Автор: dmvn 5.3.2009, 11:04

Я в своё время написал на C некоторую консольную штуковину для линковки чатов двух хабов -- она подключается к двум хабам одновременно и перекидывает сообщения с одного на другой (и наоборот). В принципе, можно ее расширить и сделать полноценный консольный ДЦ-клиент.
Причем у меня она собирается и работает как под мастдаем, так и под Linux... у меня наверное времени на настоящий клиент сейчас не хватит, но все сырцы могу выдать) допиливайте ))

P.S. по теме: но почему на Delphi?! это же кхм... недоязык. к тому же автоматически лишаемся кросс-платформенности. Уж тогда на C++ и на каком-нить Qt...

Автор: Setuper 5.3.2009, 16:50

Линковать хабы и справляться с функциями клиента - это очень разные вещи, поэтому для написания полноценного клиента не думаю, что код линковщика поможет, разве что итак известные механизмы обработки команд оттуда можно взять. Исходники выкладывай - посмотим)))

Автор: dmvn 5.3.2009, 22:29

ну в общем да, не оригинальность тут никто и не претендует big_smile.gif
сырцы тут: http://mydc.ru/r/?http://big.vip-zone.su/files/hublink/hublink.zip
там была сделана попытка написать библиотеку функций для работы с DC-хабом ( hubconn.{cpp,h} ). естественно, в ней есть только обработка команд, связанных с чатом + буферизация и разбор команд из сокета (в некотором приближении).
но уж что есть то есть, может кому пригодится -- вдруг кто саму идею разовьет и дополнит...

Автор: SerJo 6.3.2009, 21:58

По части дизайна могу помочь. Тебя интересует сами иконки программы?
Ну как по мне то тут надо много единомышленников задействовать, потому что как не как новый движок ДС++ и он естественно довольно сырой

Автор: Setuper 7.3.2009, 2:58

Самое главное, лично для меня, так это чтобы клиент был кросс-платформенным, быстрым (без всяких лишних наворотов), маленьким, консольным и с открытом С++ кодом.
Если бы данный клиент подходит по этим параметрам, то я бы посодействовал в его создании)))

Автор: Stribog 7.3.2009, 10:55

Здравствуйте форучане, может мне кто-нибудь помочь?
Я хочу написать программу на С++, что-то похожее на DC++ клиента, но я не знаю как организовать процедуру "рукопожатия хаба с клиентом" ( какой посылать ответ на $lock ) .
Помогите кто чем может !!!

P.S не стал создавать новую тему, т.к. эта тема подходит по тематике

Автор: PomanoB 7.3.2009, 11:43

http://mydc.ru/topic915.html

Вообще на $Lock можно отправлять любой $Key ))
По крайней мере у меня это прокатывало

Автор: dmvn 7.3.2009, 11:46

Да что ты говоришь? может быть ты на таком глупом хабе проверял, который это не контролирует? big_smile.gif

вот кусочек преобразования Lock в Key. 100% работоспособен, выдран из исходников выложенного чуть выше в этой теме моего hublink.

Код
string HubConn::lockToKey(const string& lock)
{
    int len = lock.length();
    char *key = new char[len+1];
    
    for(int i = 1; i < len; i++) key[i] = lock[i] ^ lock[i-1];
    key[0] = lock[0] ^ lock[len-1] ^ lock[len-2] ^ 5;

    for(int i = 0; i < len; i++) key[i] = ((key[i]<<4) & 0xF0) | ((key[i]>>4) & 0x0F);

    string result;
    for (int i = 0; i < len; i++)
    {
        char c = key[i];
        if (c == 0 || c == 5 || c == 36 || c == 96 || c == 124 || c == 126)
        {
            char buf[16];
#ifdef _WIN32
            sprintf_s(buf, 16, "/%%DCN%03d%%/", key[i]);
#else
            sprintf(buf, "/%%DCN%03d%%/", key[i]);
#endif
               result += buf;
        }
        else result += c;
    }
    delete key;
    return result;
}


UPD:
Для С++ Builder вместо sprintf_s юзаем обычный sprintf, также как и для не-win32.
для MSVC очень старых версий (6.0 и ниже)-- тоже.
А вообще это просто safe-вариант этой функции, в котором явно указана максимальная длина буфера, куда он будет фигачить результат.

Автор: PomanoB 7.3.2009, 12:24

Да, PtokaX, YnHub , VerliHub - очень глупые хабы да)

Автор: mariner 7.3.2009, 12:26

ахаха, dmvn, у него внешний бот от CS есть. Заходит на хаб как клиент. ДУмаю Романов знает кое в чем толк.

Автор: Stribog 7.3.2009, 12:34

Цитата(dmvn @ 7.3.2009, 11:46) *
вот кусочек преобразования Lock в Key. 100% работоспособен, выдран из исходников выложенного чуть выше в этой теме моего hublink.


Спасибо конечно big_smile.gif , если честно то я как раз хотел из него взять, но у меня не понимает команду sprintf_s и при компиляции выдает ошибку E2268 Call to undefined function 'sprintf_s'

Искал в гугле, но он ничего вразумительного про sprintf_s не сказал...
Компилировал CodeGear™ C++Builder® 2009 Version 12.0.3170.16989

dmvn, вы не могли бы пояснить мне что это за функция (sprintf_s) или чем её можно заменить?

Вот такая вот проблема...

Цитата(PomanoB @ 7.3.2009, 11:43) *
http://mydc.ru/topic915.html

Вообще на $Lock можно отправлять любой $Key ))
По крайней мере у меня это прокатывало

PomanoB, я видел этот пост и там не описан алгоритм ответа на $lock. А что касается "Вообще на $Lock можно отправлять любой $Key" - это точно не вариант.

Автор: Setuper 7.3.2009, 12:50

На некоторых хабах проверка ключа $lock может быть отключена, но, как говориться раз на раз не приходится. На одном хабе отключена, на другом включена, поэтому при написании клиента делать механизм отсылки хабу ключа $lock нужно обязательно!

Код
void cDCProto::Lock2Key(const string &Lock, string &Key)
{
    int count = 0, len = Lock.size(), offset = 0;
    char *key = 0, *tkey= 0;
    char * lock = new char[len+1];
    UnEscapeChars(Lock, lock, len, true);
    
    key = new char[len+1];
    
    key[0] = lock[0] ^ lock[len - 1] ^ lock[len - 2] ^ 5;
    while(++count < len) key[count] = lock[count] ^ lock[count - 1];
    key[len]=0;
    
    count = 0;
    while(count++ < len)
        key[count - 1] = ((key[count - 1] << 4)) | ((key[count - 1] >> 4));
    
    
    EscapeChars(key, len, Key, true);
    delete [] key;
    delete [] lock;
}

void cDCProto::UnEscapeChars(const string &src, char *dst, int &len ,bool WithDCN)
{
    size_t pos, pos2 = 0;
    string start, end;
    unsigned char c;
    int i = 0;
    
    if (!WithDCN) {
        start = "$#";
        end =";";
    } else {
        start = "/%DCN";
        end = "%/";
    }
    
    pos = src.find(start);
    while ((pos != src.npos) && (i < src.size()))
    {
        if (pos > pos2) {
            memcpy(dst + i, src.c_str() + pos2, pos - pos2);
            i += pos - pos2;
        }
        pos2 = src.find(end, pos);
        if ((pos2 != src.npos) &&
            ((pos2 - pos) <= (start.size()+3))) {
                c = atoi(src.substr(pos + start.size(), 3).c_str());
                dst[i++] = c;
                pos2 += end.size();
        }
        pos = src.find(start, pos + 1);
    }
    if (pos2 < src.size()) {
        memcpy(dst + i, src.c_str() + pos2, src.size() - pos2 + 1);
        i += src.size() - pos2;
    }
    len = i;
}

void cDCProto::EscapeChars(const char *buf, int len, string &dest, bool WithDCN)
{
    dest ="";
    unsigned char c;
    ostringstream os;
    while(len-- > 0)
    {
        c = *(buf++);
        switch(c)
        {
            case 0: case 5: case 36: case 96: case 124: case 126:
                os.str("");
                if (! WithDCN) os << "&#" << unsigned(c) << ";";
                else {
                    os.fill('0');
                    os << "/%DCN" << unsigned(c);
                    os.width(0);
                    os << "%/";
                }
                dest += os.str();
                break;
            default: dest += c; break;
        };
    }
}


sprintf_s - это функция VS, в билдере её нету. Что делает эта функция можно догадаться, а вообще у нас тут не форум для разъяснения синтаксиса языка С++. В интернете этого добра полно, поэтому по поводу синтаксиса языка С++ спрашивай на специализированных форумах.

Всё же советую перейти на VS, так как в подавляющем большинстве крупных компаний всё пишется именно на VS.

Автор: Kinjal 7.3.2009, 21:51

>но почему на Delphi?!
1. Потому что мне его возможностей за глаза.
2. Он не популярен в сравнении с Си, от того чувствешь себя частью небольшой, но очень гордой семьи big_smile.gif
3. На нем удобно делать визуальные компоненты и скиновые "движочки" с необходимой функциональностью для софтины.

>это же кхм... недоязык.
Ну что за детсад... базовые арифметические операции(+, -, /, *, целочисленное диление, остаток целочисленного деления, булевые операции, логические поразрядные операции), классы(с поддержкой наследования и полиморфизма, разумеется) и вариации объявления их методов(public, protected, private, property, перекрытие(override), конструкторы, деструкторы, помошники класса), for-while-repeat(плюс операторы прерывания циклов: break, continue, exit, abort)/if-else/switch-case-with/процедуры-функции(а так же вариации их объявления: предварительное, интерфейсное, внешнее, типовое, "перегрузочное"(overload), встраиваемое(inline), небезопасное(unsafe), анонимное), /основные типы(порядковые, булевые, символьные, неизвестные типы, структурные типы, целые типы, действительные типы(имеющие дробную часть), встроенные типы и типы определяемые пользователем)/приведение типов/ссылки-указатели/структуры(а так же перечисления, множества)/константы-типизированные константы/использование блоков ассемблера/try..except..finally/массивы(статические, динамические, одномерные, многомерные)/интерфейсы, перегрузка операций(операторов)/шаблоны(generics).
Возможно что-то забыл.

Считаете, выше перечисленного вам не хватит для создания полноценного Direct Connect клиента?
Лично мне - за глаза.

Но если есть претензии к IDE, а не к языку, то могу согласится что официальная борландовская/кодгировская ИДЕ - багнутая и её поведение не всегда предсказуемо.

>к тому же автоматически лишаемся кросс-платформенности.
А мне на неё пофик - я кроме виндоуса других операционок не признаю.

>на каком-нить Qt...
У меня свой скиновой движок - с теми функциями, которые мне нужны, и ничего лишнего. Просто потому что мне в этом плане проще написать своё, чем капатся в чужом.

>По части дизайна могу помочь. Тебя интересует сами иконки программы?
Не только иконки, но и в целом само оформление программы. Например... логотип, или "окно чата будет тут, такой расцевткой, такой формы, форма табов такая, список юзеров будет тут, форма у него будет этакая, табы у него будут там-то" big_smile.gif

>Ну как по мне то тут надо много единомышленников задействовать,
Совсем не зачем, я с технической частью сам легко справлюсь, разве что потом надо будет собрать народ и дружно потестить клиент в разных условиях(в частности чтобы какой-нить админ хаба его потестил с разными настройками хабов, т.к. на хабах, которые у меня установлены локально для тестинга, стоят стандартные настройки, с которыми и тестирую клиент) и на разных хабах(я тестю тока на YnHub, и иногда на Ptokax). Для проекта, и всего задуманного мною для него функционала, двух человек достаточно. Один - отвечает за всё то, что связано с технической частью клиента, второй - с интерфейсом(визуальные компоненты(типа там - окошко чата с поддержкой табов) и картинки(лого, иконки, ...)). Но у меня ещё есть два кореша, которые по надобности помогут с внутренним тестингом и какой-нить мелкой функциональностью, так что программеры как таковые есть, но нету дизайнера big_smile.gif

>потому что как не как новый движок ДС++ и он естественно довольно сырой
Разработка хоть и не второй год ведётся, но на данный момент у меня клиент очень даже стабилен, хотя и умеет не так много как стронг, но я просто основательно тестю у него каждую функцию. С ним уже сейчас можно спокойно бегать по хабам и общатцо. Плюс важнейшая часть ДЦ - высчитывание TTH - у меня реализовано на уровне стронга в плане скорости, причем судя по тестам, которые мне сделали по просьбе - высчитывает наровне со стронгом.
Правда, с другой стороны, мне не совсем понятны две вещи стронга - его функция сегментная закачка(а именно её технический аспект - каким образом работает эта функция), и каким образом стронг определяет пассивность/активность юзера(если только по галке на "Passive" в опциях Connection и невозможность открыть заданный порт - то вопрос отпадает).

>Вообще на $Lock можно отправлять любой $Key ))
>По крайней мере у меня это прокатывало
Не совсем так. Такое возможно тока в случае если, на примере YnHub'a, не стоит галка на "kick user if key invalid".

Автор: Setuper 7.3.2009, 22:25

Исходники будут открыты?

Автор: mariner 7.3.2009, 23:00

Цитата
>к тому же автоматически лишаемся кросс-платформенности.
А мне на неё пофик - я кроме виндоуса других операционок не признаю.


Тут ты ошибаешься, Брат. Не признавя другие ОСи ты страдаешь фимозом кругозора. Я, например, сисадмин (ну работаю), а значит тоже по своему программист - пишу системные скрипты и под вин и под никс (в них низя добиться кросплатформенности). Но если писать (а ты пишешь) программу и хочешь (возможно) стать давольно известным - то стоит писать на кросплатформенном языке программирования, ибо тогда (как это сделали создалели qutIM) можно добиться успеха. У меня все.

Автор: Kinjal 7.3.2009, 23:01

>Исходники будут открыты?
Кому они будут нужны? Они ж на делфе будут написаны, на недоязыке big_smile.gif

Ну а если по сути - это будет зависеть от популярности клиента. Если клиент будет не популярен - сорцы будут открыты, если популярен - то закрыты, чтобы предотвратить атаку клонов (основная причина по которой я делаю свой клиент - бесит монополия стронга и его "изменено только лого-название"-клонов).

>Не признавя другие ОСи ты страдаешь фимозом кругозора.
А вот тут ты ошибаешься, брат. Я начинаю разработку каждого своего проекта по принципу "меня бесит". Есть стронг и его клоны - меня бесят его клоны. Меня убогость его интерфейса и общее неудобство да и в целом дискомфорт который я получаю пользуясь им. Меня бесит что в нем есть много функций который мне нафик не нужны, и при этом нет нескольких которые мне очень нужны. Меня бесит что клоны на него основе - побольшому счету ничем не отличаются от него самого.
В плане кроссплатформености - аналогично. Меня винда - абсолютно устраивает. Меня она _ничем_ не бесит, в результате чего - я не заглядываюсь на альтернативы, и как следствие - не задаюсь вопросом кроссплатформенности.

>и хочешь (возможно) стать давольно известным
Ну, спорить не буду - для моего самолюбия осозновать себя в какой-то мере знаменитостью, если мой дц клиент будет успешным, будет приятно. Но это не самоцель - т.к. клиент я делаю в первую очередь для себя, чтобы мне было удобно сидеть на хабе локальной сети моего провайдера. А если он понравится другим - тоже будет приятно.

Автор: mariner 7.3.2009, 23:02

Цитата(Kinjal @ 7.3.2009, 23:01) *
Ну а если по сути - это будет зависеть от популярности клиента. Если клиент будет не популярен - сорцы будут открыты, если популярен - то закрыты, чтобы предотвратить атаку клонов (основная причина по которой я делаю свой клиент - бесит монополия стронга и его "изменено только лого-название"-клонов).


о да, конечно в клиентах типо - Апекс Спид мод, флайлинк или Грейлинк тока сменили лого! Да, а еще есть RX++ (он на своем движке, правда интрефейс аналогичный).

Автор: Setuper 7.3.2009, 23:03

2Kinjal: Тут ты глубоко ошибаешься. Праотец всех клиентов как раз таки не стронг, а DC++. Стронг - это одна из ветвей DC++.

Автор: Kinjal 7.3.2009, 23:19

2mariner: ответ на ваше сообщение в конце первой страницы, я просто подредактировал ответ на сообщение Setuper'a (чтобы не флудить лишний раз).

>Праотец всех клиентов как раз таки не стронг, а DC++.
Который от Jacek Seika? Знаю, но так получилось, что я познакомился впервые именно со стронгом, и именно с ним я сравниваю остальные клиенты. Дело скорее привычки, чем объективности.

>о да, конечно в клиентах типо - Апекс Спид мод, флайлинк или Грейлинк тока сменили лого!
Ладно, по поводу лого я сутрировал, но суть не в этом, а в том что мне, например, как рядовому юзеру, совсем не очевидно что нового в Flylink(которым я в данный момент пользуюсь) по сравнению со стронгом. Аналогично Апекс(хотя тут я совру - в апекс в connection добавили кнопку "get ip address"(и update ip on startup), но это только единственное отличие которое я заметил, хотя это отчасти и потому что я предпочитаю в настройки в стронге не ползать - там всё слишком user-hostilely для меня).

Автор: Wariner 7.3.2009, 23:25

поофтоплю: как по мне то закрытым код нужно делать только в тот момент когда ты считаешь что на этом можно заработать деньги ну или в крайнем случае что то является не этичным(или что то в этом духе)!
Так как на дц клиентах заработать невозможно и надеюсь что не появится ещё однин грейлинк, не понимаю смысл закрытия кода!

PS: чисто моё мнение)))

Автор: Setuper 7.3.2009, 23:28

Так что ты хочешь сделать? Что-то чего нет в стронге или наоборот убрать лишнее? Какова основная цель написания клиента?

Автор: Kinjal 7.3.2009, 23:28

2wariner:
ну впринципе я сторонник открытых сорцов. так или иначе проблем к их зарелизыванию я в данный момент не вижу, но так или иначе об открытости сорцов судить пока рано, пока клиент не доведен до стадии полноценного, готового к использованию. А когда клиент раскрутится там и видно будет - стоит их релизить или нет.
А по поводу грейлинка - жадность, жааадность big_smile.gif Ну или быть может автору грейлинка не хочется чтобы появлялись клоны на базе его клона big_smile.gif

P.S. И по поводу моего предыдущего сообщения, забыл добавить: быть может я переоцениваю стронгдц? и его клоны в чем-то лучше, чем сам он?

Автор: Wariner 7.3.2009, 23:30

Цитата(Kinjal @ 7.3.2009, 23:28) *
быть может я переоцениваю стронгдц? и его клоны в чем-то лучше, чем сам он?

я не искал разницы в флае и стронге но чисто инстинктивно ставлю на флай))))

Автор: Setuper 7.3.2009, 23:31

А чем конкретно тебя не устраивает стронг?

Не думаю, что ты такой мозг, что можешь написать что-то лучше стронга, поэтому не думаю, что народ будет активно юзать твой клиент.

Автор: Kinjal 7.3.2009, 23:42

>А чем конкретно тебя не устраивает стронг?
На этот вопрос мне сложно ответить, когда клиент дойдет до стадии бета - он это скажет за меня big_smile.gif

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

Автор: Shark136 8.3.2009, 12:23

Люди давайте перестанем разбираться кому что и почему !! Это уже личное предпочтение и видение каждого.

Суть темы в поиске Программиста - Дизайнера. Кто готов помочь ? Забейте вы на все предубеждения и если готовы, хотите и можете то присоединятесь.

Автор: Setuper 8.3.2009, 12:34

А ты откуда такой взялся?
Для того, чтобы помогать с дизайном вероятно сначала надо определить стоит ли оно того? Разве я не прав?

Автор: Shark136 8.3.2009, 13:17

С неба я нарисовался.

>>Разве я не прав?

Логично, но тут начались какие то войны типа - этот клиента лучше, а чем тебя этот не устраивает.

Суть уже изложена, сделать клиент с достаточным минимумом под свои потребности, с реализацией функцией сделающих работу удобной.
Клиент задумался как Альтернатива. Потому что все клиенты базивруется на 1 и том же интерфейсе. И никакого удобства я лично не испытываю пользуясь ими. Есть много интересных задумок которые хотим реализовать.

Главное это юзабилити, а в этом направлении работы не початый край.

Автор: mariner 8.3.2009, 13:57

я мог бы сюда запостить как минимум 3 интерфейса еще (на выбор). Но мне лень. Если еще интерфейс mldonky, microdc2 (консолька, да), phpdc (ееще могу вспомнить)

PPS а ваще, всем кто хочет - разгребите ядро microdc2 - все будет у вас пахать в принципе. Ну иморду натянуть - дело 3е.

Автор: Mega-Killer 24.12.2009, 12:26

Цитата(Kinjal @ 4.3.2009, 0:25) *
Всем привет.

Пару дней назад появилось желание написать свой клиент, отличный от стронга и его клонов(в том числе визуально, по меню настроек, и даже в используемом языке программирования :-)). Немного урезанный по функциональности(в стронге достаточно функций которыми я не пользуюсь), но и со своими фишками.

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

Ну и прикладываю скриншот(на нем - законченная серверная часть(client<->hub)), чтобы показать, что разговор не на пустом месте, а есть определенные наработки.

молодец exciting.gif ,но можно былобы и подкрасить прогу маненько....сделать её маненько веселее а то на набросках всё гробового цвета кроме чата и окна ников