Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Протокол обмена между клиентом и сервером


Страницы:   1 2 3 4 5 6

Gek1 ©   (2005-05-18 18:30:00) 

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

Как известно - по пути пакеты могут резаться и склеиватся. Но получается что расжатый Хаффманом кусок пакета даст совсем другие данные. Практически всегда эти первая часть данных будет не поврежденна, что даст мне понять что за пакет идет и я смогу дождатся пока прийдет его полная длинна.

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

Сам протокол обмена я поменять не могу. Он придуман не мною и очень давно. Сервер тоже написан не мною. Я написал всего лишь клиент для сервера.

Возникает вопрос:
Можно ли всетаки как-то узнать длинну целого пакета, который отправлял сервер?

Мастера, подскажите пожалуйста что можно сделать в данной ситуации?

P.S. если понадобится код - приведу.


Eraser   (2005-05-20 15:18:00) [21]

Gek1   (20.05.05 15:16) [81]
Пакет сервером сжался... ТСП протокол порезал его на 2 куска и отправил.


Да причём тут вообще TCP?
Добрый совет: купи и главное прочитай хорошую книгу по TCP/IP.


Gek1   (2005-05-20 15:18:00) [22]


> False_Delirium ©   (20.05.05 15:13) [80]

В инжекте теже проблемы, но он похоже согласился с тем, что иногда будут глюки.


Gek1   (2005-05-20 15:16:00) [23]

Вот пример сжатого блока:

14:10:32 Unknown Name, Server -> Client (Compressed), len: 5
0000: 81 68 E4 FE 80

14:10:32 Unknown Name, Server -> Client (Compressed), len: 564
0000: 46 41 87 D1 AB CE 48 00 00 00 00 00 00 00 00 00 00 00 00 01
0001: A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 D0 00 00 00
0002: 00 00 00 00 00 00 00 00 00 00 00 00 D0 00 00 00 00 00 00 00
0003: 00 00 00 00 00 00 00 00 D0 00 00 00 00 00 00 00 00 00 00 00
0004: 00 00 00 00 D0 5B D0 11 BE 6F 00 00 00 00 00 00 00 5E F1 7F
0005: 1B 78 7E 78 E6 F3 0C 00 00 00 00 03 40 FA 32 0F 1F 11 A0 00
0006: 00 00 00 00 00 8F E8 ED 9A D9 C8 70 79 1C 3E 40 00 00 00 00
0007: 34 8A 72 1C 1C DD 20 F1 00 00 00 00 00 00 E1 F4 76 CC D5 E6
0008: D9 C8 70 73 74 E3 07 A0 00 00 00 06 80 68 8C F1 E3 8B 85 AB
0009: C5 E0 00 00 00 00 00 67 3C 46 AC 1D 80 00 00 00 00 00 03 40
000A: EA BD 0E 0F 17 68 31 A0 00 00 00 00 00 17 2F 2E D9 AD 48 F4
000B: CD E4 00 00 00 00 00 34 A1 19 D1 C3 07 8C 6C 1E 80 00 00 00
000C: 00 00 67 3C 46 AC 1D 80 00 00 00 00 00 03 40 EE EE 81 E5 AB
000D: C6 08 00 00 00 00 00 01 9C F1 1A B0 76 00 00 00 00 00 00 0D
000E: 65 CD 58 74 87 D2 D9 C8 7D 3C 80 00 00 00 00 19 CF 11 AB 07
000F: 60 00 00 00 00 00 00 D0 E0 95 F9 76 B1 F3 0C 00 00 00 00 00
0010: 00 CE 78 8D 58 3B 00 00 00 00 00 00 06 80 62 9C 87 07 37 48
0011: 3C 40 00 00 00 00 00 38 7D 1D B3 35 79 B6 71 AB A4 6A C3 32
0012: 07 88 7C 7C 80 00 00 1A AD 72 83 C7 90 00 00 00 00 00 00 04
0013: 67 48 3C 6D 47 F1 CD 0F A7 18 DF 20 00 00 00 01 A0 79 5E 87
0014: 07 8B B4 18 D0 00 00 00 00 00 0C E7 88 D5 83 B0 00 00 00 00
0015: 00 00 68 CE CE 4D 8D 8D E9 C7 CF 98 6E 03 B5 B9 CF 3C 40 00
0016: 00 00 33 9E 23 56 0E C0 00 00 00 00 00 01 A0 97 F5 C6 C6 B5
0017: 78 00 00 00 00 00 00 0C E7 88 D5 83 B0 00 00 00 00 00 00 68
0018: AB DD 36 16 81 E5 AB 04 00 00 00 00 00 03 39 E2 35 60 EC 00
0019: 00 00 00 00 00 1A AF C3 F0 8A F2 00 00 00 00 00 00 02 3F A3
001A: B6 6B 52 3D 33 79 00 00 00 00 00 0D 71 95 F9 76 B1 F3 0C 00
001B: 00 00 00 00 00 63 43 F1 C6 FF 1E 39 2D 63 71 E2 00 00 00 00
001C: 06 80 00 D0


И после распаковки и разборки - результат:

14:10:32 Unknown Name, Server -> Client: 0xA9, len: 1380
0000: A9 05 64 01 4D 69 72 61 6C 65 78 00 00 00 00 00 00 00 00 00
0001: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0002: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0003: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0004: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0005: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0006: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0007: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0008: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0009: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000A: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000B: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000C: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000D: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000E: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000F: 00 00 00 00 11 00 59 65 77 00 00 00 00 00 00 00 00 00 00 00
0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 54 6F 77
0011: 6E 20 43 65 6E 74 65 72 00 00 00 00 00 00 00 00 00 00 00 00
0012: 00 00 00 00 00 00 00 00 01 4D 69 6E 6F 63 00 00 00 00 00 00
0013: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0014: 45 61 73 74 20 42 72 69 64 67 65 00 00 00 00 00 00 00 00 00
0015: 00 00 00 00 00 00 00 00 00 00 00 02 42 72 69 74 61 69 6E 00
0016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0017: 00 00 00 43 61 73 74 6C 65 20 42 72 69 74 61 6E 69 61 00 00
0018: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 4D 6F 6F 6E 67
0019: 6C 6F 77 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
001A: 00 00 00 00 00 00 44 6F 63 6B 73 00 00 00 00 00 00 00 00 00
001B: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 54 72
001C: 69 6E 73 69 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
001D: 00 00 00 00 00 00 00 00 00 57 65 73 74 20 47 61 74 65 00 00
001E: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
001F: 05 4D 61 67 69 6E 63 69 61 00 00 00 00 00 00 00 00 00 00 00
0020: 00 00 00 00 00 00 00 00 00 00 00 00 44 6F 63 6B 73 00 00 00
0021: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0022: 00 00 00 06 4A 68 65 6C 6F 6D 00 00 00 00 00 00 00 00 00 00
0023: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 44 6F 63 6B 73
0024: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0025: 00 00 00 00 00 00 07 53 6B 61 72 61 20 42 72 61 65 00 00 00
0026: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 44 6F
0027: 63 6B 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0028: 00 00 00 00 00 00 00 00 00 08 56 65 73 70 65 72 00 00 00 00
0029: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
002A: 00 44 6F 63 6B 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00
002B: 00 00 00 00 00 00 00 00 00 00 00 00 09 42 72 69 74 61 69 6E
002C: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
002D: 00 00 00 00 43 61 73 74 6C 65 20 42 6C 61 63 6B 74 68 6F 72
002E: 6E 65 00 00 00 00 00 00 00 00 00 00 00 00 00 0A 57 69 6E 64
002F: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0030: 00 00 00 00 00 00 00 4D 61 69 6E 20 45 6E 74 72 61 6E 63 65
0031: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0B 54
0032: 72 69 6E 73 69 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0033: 00 00 00 00 00 00 00 00 00 00 44 6F 63 6B 73 00 00 00 00 00
0034: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0035: 00 0C 42 75 63 63 61 6E 65 65 72 27 73 20 44 65 6E 00 00 00
0036: 00 00 00 00 00 00 00 00 00 00 00 00 00 44 6F 63 6B 73 00 00
0037: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0038: 00 00 00 00 0D 4F 63 63 6C 6F 00 00 00 00 00 00 00 00 00 00
0039: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 44 6F 63 6B
003A: 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
003B: 00 00 00 00 00 00 00 0E 4E 75 6A 68 65 6C 6D 00 00 00 00 00
003C: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 44
003D: 6F 63 6B 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
003E: 00 00 00 00 00 00 00 00 00 00 0F 43 6F 76 65 00 00 00 00 00
003F: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0040: 00 00 45 61 73 74 20 47 61 74 65 00 00 00 00 00 00 00 00 00
0041: 00 00 00 00 00 00 00 00 00 00 00 00 00 10 56 65 73 70 65 72
0042: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0043: 00 00 00 00 00 49 72 6F 6E 77 6F 6F 64 20 49 6E 6E 00 00 00
0044: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00


Как видно:
Пакет сервером сжался... ТСП протокол порезал его на 2 куска и отправил.
Я принял... проанализировал и получил готовый пакет.
(В данном случае готовый один пакет, но частенько могуть быть несколько готовых пакетов)
Поэтому в коде и фигурирует:
"Проверка N целых пакетов"


False_Delirium   (2005-05-20 15:13:00) [24]

http://uo.menatwork.com.ua/files/injection/uoinj.rar

Всё это должно делаться насколько я помню.


Gek1   (2005-05-20 15:09:00) [25]


> А есть ещё и несжатый блок? Кстати, как ты определяешь сжатый
> это блок или нет? )

После того как отработает LoginClient ... стартует GameClient и все данные от сервера сжимаються.


Eraser   (2005-05-20 14:55:00) [26]

Gek1   (20.05.05 14:54) [77]
Дамп самого сжатого блока


А есть ещё и несжатый блок? Кстати, как ты определяешь сжатый это блок или нет? )


Gek1   (2005-05-20 14:54:00) [27]


> Значит длина пакета строго регламентирована!
> Dump снифера многое бы прояснил... может быть.

Дамп самого сжатого блока или история длин блоков?


Eraser   (2005-05-20 14:51:00) [28]

Gek1   (20.05.05 14:48) [74]
Ну не передает сервер длинну сжатого блока.


Значит длина пакета строго регламентирована!
Dump снифера многое бы прояснил... может быть.


Digitman   (2005-05-20 14:50:00) [29]


> Сам протокол очень сложен


как бы ни был он сложен, но до тех пор пока ты не знаешь те его соглашения, которые ты пытаешься использовать, - грош цена твоему коду, работать он как положено не будет, и затея твоя стоит ГОРАЗДО дороже того что ты предполагал на момент "зачатия"


Gek1   (2005-05-20 14:48:00) [30]


> НИ о каких пакетах НЕ может идти речи, пока "сжатые" данные
> НЕ "разжаты" !
> а чтобы их "разжать" , нужно знать хотя бы длину данных,
> содержащих "сжатые" данные, перед сжатием представлявшие
> собой N пакетов

Ну не передает сервер длинну сжатого блока.
Я расжимаю все эти фрагменты и там уже анализирую.
Если проанализировав я определил, что там неполные данные, то не трогаяю буффер и жду пока прийдет еще один фрагмент.

Далее клею это фрагмент в конец и расжимаю опять все это дело.
Потом опять анализирую и тд


Gek1   (2005-05-20 14:42:00) [31]


> Всё. Я ретируюсь.. ))

:-)
Сам протокол очень сложен. Я начал это дело еще прошлым летом. Только зимой у меня получилось чтото сделать первое. Долго собирал всю информацию о протоколе и всех особенностях.
Много часов провел за обычным клиентом с логером, анализируя что означает каждый пакет.


Eraser   (2005-05-20 14:41:00) [32]

Gek1   (20.05.05 14:39) [70]

Тогда со сниффером наперевес надо анализировать что там посылается...


Digitman   (2005-05-20 14:41:00) [33]


> Gek1   (20.05.05 14:34) [68]



> Принятый "шматок" дописываю в конец буффера


не возражаю.


> если в прошлый раз пришел оборваный пакет


в ПРОШЛЫЙ раз пришел не "оборваный пакет", а очередной фрагмент неких данных, упакоавнных Хафман-компрессором !!
НИ о каких пакетах НЕ может идти речи, пока "сжатые" данные НЕ "разжаты" !
а чтобы их "разжать" , нужно знать хотя бы длину данных, содержащих "сжатые" данные, перед сжатием представлявшие собой N пакетов


Gek1   (2005-05-20 14:39:00) [34]


> А где-нибудь есть SDK или описание протокола данной сетевой
> игрушки.

Если бы было SDK - я бы ВАМ и себе голову не морочил. Давно уже все бы работало. Игрушка старая. Описание протокола закрыто и никому в руки не попадало.
Есть только кодеры, которые потихонечку анализировали и разгадывали как он устроен, но до конца он неизвестен.


> Без файлов данного архива Вы не сможете играть на сервере.
> Файлы из данного архива необходимо разархивировать в папку
> с игрой. В данном архиве следующие файлы: client.exe, abyss.dll."
>
> Скорее всего вся "логика" соединения в этих файлах... уже
> создана разработчиком сервера.

Это ты нашел сам клиент от разрабочиков, только забыл его версию глянуть, так как криптация в них различна.
abyss.dll - на абисе небыл, но многие вставляют dll-ки, которые борятся с любителями искать "багов" в программах.
Сам тоже не люблю любителей "багов", поэтому стараюсь, чтобы они пользоватся ими не могли.


Eraser   (2005-05-20 14:36:00) [35]

Gek1   (20.05.05 14:34) [68]

если в прошлый раз пришел оборваный пакет, то буфер не будет пустым и новый "шматок" допишется к старым "шматкам".


Всё. Я ретируюсь.. ))


Gek1   (2005-05-20 14:34:00) [36]


> "шматок" данных ты рпринял, а не "данные".

Да. шмоток ... кусочек ...


> какие "данные"-то ? только что принятый "шматок" или N "шматков",
> принятых ранее + текущий "шматок" ?

Принятый "шматок" дописываю в конец буффера.
если в прошлый раз пришел оборваный пакет, то буфер не будет пустым и новый "шматок" допишется к старым "шматкам".
если же буфер пустой, то будет первый "шматок" или не "шматок" - это вы проверим проверкой на наличие N целых пакетов.


Eraser   (2005-05-20 14:32:00) [37]

Gek1   (20.05.05 14:29) [65]

Вот щас нашёл в сети, где можно скачать клиент, такую надпись

"Без файлов данного архива Вы не сможете играть на сервере. Файлы из данного архива необходимо разархивировать в папку с игрой. В данном архиве следующие файлы: client.exe, abyss.dll."

Скорее всего вся "логика" соединения в этих файлах... уже создана разработчиком сервера.


Gek1   (2005-05-20 14:29:00) [38]


> Возможен еще вариант - каждый запакованный пакет имеет одинаковую
> длину, определенную разработчиком.

Необходимые пакеты собираються в цепочку .... сжимаються .. и отправляются клиенту.

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


Eraser   (2005-05-20 14:29:00) [39]

Gek1   (20.05.05 14:25) [64]

А где-нибудь есть SDK или описание протокола данной сетевой игрушки.


Gek1   (2005-05-20 14:25:00) [40]


> 1. Что за сервер? Приведи название программы.

Ultima Online
В основном используються POL сервера, поэтому я тестирую на POL095.
Хотя на Sphere глюки тоже были замечены.


> 2. каждый пакет может в свою очередь иметь дин. длинну
>
> в TCP впринципе очень сложно формировать каждый пакет по
> отдельности

Когда я говорил пакет, я имеел ввиду пакет с информацией, посланный самим сервером.
В случае с TCP - я писал TCP пакет.

Например:

0x1A Packet
Object Information (Variable # of bytes)
· BYTE cmd
· BYTE[2] blockSize
· BYTE[4] itemID
· BYTE[2] model #
· if (itemID & 0x80000000)
· BYTE[2] item count (or model # for corpses)
· if (model & 0x8000)
· BYTE Incr Counter (increment model by this #)
· BYTE[2] xLoc (only use lowest significant 15 bits)
· BYTE[2] yLoc
· if (xLoc & 0x8000)
· BYTE direction
· BYTE zLoc
· if (yLoc & 0x8000)
· BYTE[2] dye
· if (yLoc & 0x4000)
· BYTE flag byte (See top)


Вот это пакет 0x1A от сервера. Непутайте с TCP пакетами.


> Где-то ДОЛЖНА передаваться длина данных... или стоп-последовательность
> (что врядли).

В сжатой части длинна не обнаружена и стоп последовательность тоже.

Весь мой алгоритм опирается на данные, полученные после распаковки.


Страницы:   1 2 3 4 5 6

Наверх

Титульная страница Поиск, карта сайта Написать письмо