Вернуться   CoderX :: Forums > Основные форумы > Программинг
Войти через OpenID

Программинг Форум для тем связанных с программированием

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 10.12.2011, 21:52   #1
Местный
 
Аватар для Elecktron
 
Регистрация: 27.10.2011
Адрес: Харьков
Сообщений: 106
Сказал Спасибо: 24
Имеет 11 спасибок в 7 сообщенях
Elecktron пока неопределено
По умолчанию разбор пакетов

кто как реализует разбор пакетов?
мне пока что в голову ничего лучше не приходит (кусок исходника джава сервера):

Код:
switch (opcode)
				{
					case 0x00:
						msg = new Logout();
						break;
                    case 0x0c:
                        msg = new CharacterCreate();
                        break;
                    case 0x0d:
                        msg = new CharacterDelete();
                        break;
                    case 0x12:
                        msg = new CharacterSelect();
                        break;
                    case 0x13:
                        msg = new NewCharacter();
                        break;
                                }
__________________
C++Builder 6, Delphi 7, RAD Studio XE2, MS VC++...
Elecktron вне форума   Ответить с цитированием
Старый 11.12.2011, 04:07   #2
Рыцарь
 
Аватар для alexteam
 
Регистрация: 07.03.2009
Сообщений: 9,139
Сказал Спасибо: 70
Имеет 2,820 спасибок в 1,735 сообщенях
alexteam на пути к лучшему
По умолчанию

ну разве что чтото вроде

delphi Код:
type   TParserFunc = procedure ..... var   OpcodesFuncs : array[0..$ff] of TParserFunc;
гдето:
delphi Код:
OpcodesFuncs[0] := @Parse_Die; ........ OpcodesFuncs[$DA] := @Parse_exPackets; ........
гдето вместо кейса:

delphi Код:
OpcodesFuncs[packet.opcode]();

не си но идея понятна.
__________________
L2Ext - project closed.
alexteam вне форума   Ответить с цитированием
За это сообщение alexteam нажился 3 спасибками от:
Старый 10.01.2012, 12:00   #3
Местный
 
Аватар для Elecktron
 
Регистрация: 27.10.2011
Адрес: Харьков
Сообщений: 106
Сказал Спасибо: 24
Имеет 11 спасибок в 7 сообщенях
Elecktron пока неопределено
По умолчанию

с разбором пакетов по ID разобрался.

а как разбить пакет на составляющие? (dword, char, string)
особенно неясно как быть с "секциями" с переменной длиной... (имя, титул персонажа)
__________________
C++Builder 6, Delphi 7, RAD Studio XE2, MS VC++...
Elecktron вне форума   Ответить с цитированием
Старый 10.01.2012, 16:38   #4
Местный
 
Аватар для supernewbie
 
Регистрация: 23.09.2009
Сообщений: 1,232
Сказал Спасибо: 119
Имеет 172 спасибок в 134 сообщенях
supernewbie пока неопределено
По умолчанию

Elecktron, формат надо знать, насчёт имён и титулов - это PWideChar так что в конце 00 00

есть там ещё циклы с блоками, дык там тоже всё просто - кол-во итераций пишется где-нить перед самими блоками
__________________
Начало.

Последний раз редактировалось supernewbie, 10.01.2012 в 16:45.
supernewbie вне форума   Ответить с цитированием
Старый 10.01.2012, 22:26   #5
Местный
 
Аватар для Elecktron
 
Регистрация: 27.10.2011
Адрес: Харьков
Сообщений: 106
Сказал Спасибо: 24
Имеет 11 спасибок в 7 сообщенях
Elecktron пока неопределено
По умолчанию

спасибо за ответ.
то что ник и титул widechar я вкурсе.
формат пакетов есть.

в лог я записываю вот так:
Код:
   for (int i=0;i<packet->size;i++)
   {
    wsprintfA(buf, "%x",packet->data[i]);
    stf(buf);
    stf(" ");
   }
но это весь пакет...

а мне нужно распределять по переменным, с которыми я буду уже работать.

пакет это массив, а переменные не массивы, и как это совместить я немогу понять...
__________________
C++Builder 6, Delphi 7, RAD Studio XE2, MS VC++...
Elecktron вне форума   Ответить с цитированием
Старый 10.01.2012, 22:32   #6
Местный
 
Аватар для supernewbie
 
Регистрация: 23.09.2009
Сообщений: 1,232
Сказал Спасибо: 119
Имеет 172 спасибок в 134 сообщенях
supernewbie пока неопределено
По умолчанию

ну как епт, перемещением памяти в переменные
в делфи это делается процедурой Move, в C++ вроде memcopy
__________________
Начало.
supernewbie вне форума   Ответить с цитированием
Старый 11.01.2012, 01:43   #7
Местный
 
Аватар для Elecktron
 
Регистрация: 27.10.2011
Адрес: Харьков
Сообщений: 106
Сказал Спасибо: 24
Имеет 11 спасибок в 7 сообщенях
Elecktron пока неопределено
По умолчанию

memcpy() копирует массив в массив.
а мне нужно кусок массива в DWORD например..
или кусок массива в widestring, причем с четким определением его длины, чтобы потом было понятно с какого места продолжать чтение пакета.
потому что длина отводимая под ник/титул изменяется в пакете в зависимости от количества символов в нике/титуле...
ник/титул добивается нулями до длины 16/32 байта.
__________________
C++Builder 6, Delphi 7, RAD Studio XE2, MS VC++...
Elecktron вне форума   Ответить с цитированием
Старый 11.01.2012, 03:04   #8
Рыцарь
 
Аватар для alexteam
 
Регистрация: 07.03.2009
Сообщений: 9,139
Сказал Спасибо: 70
Имеет 2,820 спасибок в 1,735 сообщенях
alexteam на пути к лучшему
По умолчанию

Цитата:
memcpy() копирует массив в массив.
колво байтиков которые нужно скопировать указать нельзя чтоле ? да и не масив в масив, а кусок данных.
Цитата:
а мне нужно кусок массива в DWORD например..
и ? 4 байтика скопировать ? в чем трабл ?
Цитата:
или кусок массива в widestring
перебираем массив парами (word)
пока не наткнемся на 0. считаем колво.
алокейтим строку, копируем байтики.
Цитата:
ник/титул добивается нулями до длины 16/32 байта.
пох на длину вайдстринга в пакете.
тебе нужна пара нулей. (выше писали)
__________________
L2Ext - project closed.

Последний раз редактировалось alexteam, 11.01.2012 в 03:07.
alexteam вне форума   Ответить с цитированием
Старый 11.01.2012, 03:29   #9
Местный
 
Аватар для supernewbie
 
Регистрация: 23.09.2009
Сообщений: 1,232
Сказал Спасибо: 119
Имеет 172 спасибок в 134 сообщенях
supernewbie пока неопределено
По умолчанию

Цитата:
Сообщение от alexteam Посмотреть сообщение
перебираем массив парами (word)
пока не наткнемся на 0. считаем колво.
алокейтим строку, копируем байтики.
кстати додумался как круче делать - string(pchar(@pck[байт с которого идёт строка]));
кто-нить видит подводные камни?
__________________
Начало.
supernewbie вне форума   Ответить с цитированием
Старый 11.01.2012, 03:29   #10
Местный
 
Аватар для Elecktron
 
Регистрация: 27.10.2011
Адрес: Харьков
Сообщений: 106
Сказал Спасибо: 24
Имеет 11 спасибок в 7 сообщенях
Elecktron пока неопределено
По умолчанию

Цитата:
колво байтиков которые нужно скопировать указать нельзя чтоле ? да и не масив в масив, а кусок данных.
про количество я вкурсе. я не понял как вытащить кусок не сначала, например с пятого по восьмой..

Цитата:
перебираем массив парами (word)
пока не наткнемся на 0. считаем колво.
алокейтим строку, копируем байтики.
ок. попробую..
__________________
C++Builder 6, Delphi 7, RAD Studio XE2, MS VC++...
Elecktron вне форума   Ответить с цитированием
Ответ

  CoderX :: Forums > Основные форумы > Программинг



Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 18:04.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!