Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 09.03.2009, 22:34   #1
Blowball
 
Регистрация: 09.03.2009
Сообщений: 7
Вопрос Помогите сгенерировать сетевой пакет для ICQ

Добрый вечер всем! работаю на С++ Builder 6. Возник вопрос как можно сгенерировать динамически пакет ICQ для отправки на сервер.
Тоесть:
1. порядковый номер пакета
2. чек сумма отправляемых данных
3. логин и пароль
и.тп
как вставить в пакет все эти нужные данные я знаю, но вопрос в том скорее всего, как мне сделать динамический массив со всеми этими данными, пробовал пользоваться векторами ведь с ними не составляет проблем подсчитать общий размер динамического массива.Возможно я и не прав)) Надеюсь объяснил понятно ))
знаю что есть компоненты для работы с аськой, но хочется самому понять как генерировать нужные пакеты (массивы) для отправки.
Спасибо! )
Blowball вне форума
Старый 10.03.2009, 17:16   #2
Night_Light
Пользователь
 
Регистрация: 26.02.2009
Сообщений: 14
По умолчанию

Тогда уже используй std::string а не вектор
Night_Light вне форума
Старый 10.03.2009, 18:13   #3
Blowball
 
Регистрация: 09.03.2009
Сообщений: 7
Радость

Цитата:
Сообщение от Night_Light Посмотреть сообщение
Тогда уже используй std::string а не вектор
Спасибо Night_Light! Обязательно попробую !
Тоесть потом загнать эту строку в массив? И не будет ли проблем потом с подсчетом этого массива если он у меня будет динамический?
Blowball вне форума
Старый 10.03.2009, 18:36   #4
Night_Light
Пользователь
 
Регистрация: 26.02.2009
Сообщений: 14
По умолчанию

А что тебе надо считать? Колличество символов?
У std::string как и у всех STL контейнеров есть метод size который возвращает колличетсво элементов. А метод c_str() вернёт временный буфер на сишную строку с содержимым std::string.
Night_Light вне форума
Старый 10.03.2009, 18:51   #5
Blowball
 
Регистрация: 09.03.2009
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Night_Light Посмотреть сообщение
А что тебе надо считать? Колличество символов?
У std::string как и у всех STL контейнеров есть метод size который возвращает колличетсво элементов. А метод c_str() вернёт временный буфер на сишную строку с содержимым std::string.
На счет std::string понял спасибо еще раз ))) я думаю для наглядности сейчас выложу код )) только не судите строго, код выглядит так словно написал бухой строитель)) это мой первый опыт с векторами,с пакетами и с памятью в с++.
Blowball вне форума
Старый 10.03.2009, 19:15   #6
Blowball
 
Регистрация: 09.03.2009
Сообщений: 7
Смущение

Код:
void login_ICQ(char *login,char *pwd)   //есть некая функция с указателями на логин и пароль
{

vector<char> pck;                       // создаю вектор

//эти массивы это некий скелет который я записываю в вектор
// а массив p_end это те данные которые я не меняю и отправляю как есть
char pck_type[] = "\x2A";
char pck_channel[] = "\x01";
char pck_seq_num[] = "\x59\xCC";
char ch_sum[] = "\x00\x00";
char login_type[] = "\x00\x00\x00\x01\x00\x01\x00";
char pass_type[] = "\x00\x02\x00";
char p_end[] = "\x00\x03\x00\x0A\x49\x43\x51\x20\x43\x6C\x69\x65\x6E\x74\x00"
               "\x16\x00\x02\x01\x0A\x00\x17\x00\x02\x00\x06\x00\x18\x00\x02"
               "\x00\x05\x00\x19\x00\x02\x00\x00\x00\x1A\x00\x02\x00\x68\x00"
               "\x14\x00\x04\x00\x00\x07\x53\x00\x0F\x00\x02\x65\x6E\x00\x0E"
               "\x00\x02\x75\x73";



//ксорю пароль по маске используемой в аске

        char pass_xor[]="\xF3\x26\x81\xC4\x39\x86\xDB\x92\x71"
                        "\xA3\xB9\xE6\x53\x7A\x95\x7C";

        for (int x = 0;x < strlen(pwd);x ++)
                {
                pwd[x] = pwd[x]^pass_xor[x];
                }
/* узнаю длинну логина и пароля и потом тоже вписываю в пакет,
конвертирую полученную длину в char я так понимаю чтобы она была представленна в виде Hex
не ругайтесь пожалуйста)) делаю это не самым лучшим способом (только учусь) */

int l = strlen(login);
char *l_size = (char*)&l;
int p = strlen(pwd);
char *p_size = (char*)&p;

//таким образом заношу все в пакет

pck.push_back(pck_type[0]);
pck.push_back(pck_channel[0]);
for(int i=0;i<sizeof(pck_seq_num)-1;i++){pck.push_back(pck_seq_num[i]);}
for(int i=0;i<sizeof(ch_sum)-1;i++){pck.push_back(ch_sum[i]);}
for(int i=0;i<sizeof(login_type)-1;i++){pck.push_back(login_type[i]);}

pck.push_back(l_size[0]); // записываю один байт из нужных двух, думаю потом разберусь
for(int i=0;i<strlen(login);i++){pck.push_back(login[i]);}
for(int i=0;i<sizeof(pass_type)-1;i++){pck.push_back(pass_type[i]);}

pck.push_back(p_size[0]);
for(int i=0;i<strlen(pwd);i++){pck.push_back(pwd[i]);}
for(int i=0;i<sizeof(p_end)-1;i++){pck.push_back(p_end[i]);}

//вот тут тоже нагородил непойми чего ))

packet_len = pck.size();
int sum = packet_len-6;
char *bytes;
bytes = (char*)&sum;
// не знал как иначе перевернуть байты в нужный порядок сделал так ))
pck[4] = bytes[1];
pck[5] = bytes[0];
// записываю все в нужный массив

memcpy(toSend,&pck[0],packet_len);

/*при выполнении получаеться бред, отлавливаю этот пакет сниффером, логин почемуто срезан
на два байта с лева (с начала), соответственно получаю socket error и связь рвется*/

/*код выполнения */

toSend = new char [icq.packet_len];   /*icq структура в ней есть переменная
                                        packet_len получающая размер всего пакета
                                        для создания массива для отправки*/

icq.login_ICQ(login,pwd);

sock->Socket->SendBuf(icq.toSend,icq.packet_len) //sock это обычный ClientSocket
}
Blowball вне форума
Старый 11.03.2009, 10:21   #7
Night_Light
Пользователь
 
Регистрация: 26.02.2009
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Blowball Посмотреть сообщение
Код:
for(int i=0;i<strlen(login);i++){pck.push_back(login[i]);}
for(int i=0;i<sizeof(pass_type)-1;i++){pck.push_back(pass_type[i]);}

pck.push_back(p_size[0]);
for(int i=0;i<strlen(pwd);i++){pck.push_back(pwd[i]);}
for(int i=0;i<sizeof(p_end)-1;i++){pck.push_back(p_end[i]);}
Копирование элементов лучше сделать через стандартный алгоритм:
std::copy( login, login + strlen(login), std::back_inserter(pck));
Night_Light вне форума
Старый 11.03.2009, 10:28   #8
Night_Light
Пользователь
 
Регистрация: 26.02.2009
Сообщений: 14
По умолчанию

А у тебя icq.packet_len
toSend = new char [icq.packet_len];
и локальной packet_len значения совпадают? icq.packet_len случайно не меньше чем packet_len ?
Night_Light вне форума
Старый 11.03.2009, 15:33   #9
Blowball
 
Регистрация: 09.03.2009
Сообщений: 7
Радость

Цитата:
Сообщение от Night_Light Посмотреть сообщение
А у тебя icq.packet_len
toSend = new char [icq.packet_len];
и локальной packet_len значения совпадают? icq.packet_len случайно не меньше чем packet_len ?
совпадают я просто забыл здесь в теме указать перед packet_len обращение к структуре icq , дело наверно в том что toSend = new char [icq.packet_len]; я создаю раньше чем выполняется сама функция login, может он какраз и не получает нужный размер.
P.S:Night_Light спасибо еще раз за столь поучительную информацию о классе std ))

Последний раз редактировалось Blowball; 11.03.2009 в 15:36.
Blowball вне форума
Старый 11.03.2009, 16:33   #10
Blowball
 
Регистрация: 09.03.2009
Сообщений: 7
По умолчанию

Night_Light я заменил циклы через которые заносил информацию на std и сразу решилась проблема с обрезанием логина в пакете, спасибо 3 раз)
вот а по поводу toSend = new char [icq.packet_len]; я сделал так
Код:
char packet[256]; //создал массив
icq.login_ICQ(login,pwd,packet); //выполнил функцию следовательно получил размер пакета в целом
sock->Socket->SendBuf(packet,icq.packet_len) //тупо его отправил но уже с нужной длинной
Только вот не знаю грамотно ли это,остаются неиспользуемые элементы этого массива, а это же ведь лишняя память )
может как то подругому сделать?
Так: char packet[]=""; получаю ошибку и думаю она справедлива

Последний раз редактировалось Blowball; 11.03.2009 в 16:36.
Blowball вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ICQ для телефона мелкого размера MAKEDON Общие вопросы по Java, Java SE, Kotlin 4 17.10.2008 21:16
Сгенерировать много GIF Dj_smart Мультимедиа в Delphi 3 20.05.2008 21:38