Giter Site home page Giter Site logo

Comments (5)

GoogleCodeExporter avatar GoogleCodeExporter commented on July 29, 2024
Никакого патриотизма, даже задачи для 
своих же земляков на английском и это при 
полном отсутствии буржуев...

Original comment by [email protected] on 15 May 2012 at 10:25

from uo-ext.

GoogleCodeExporter avatar GoogleCodeExporter commented on July 29, 2024
Сразу о бардаке что творится с протоколом... 
он мне не нравится: Во первых если пакет 
имеет динамичный размер то он должен 
ставиться после ID пакета без всяких "или", в 
этом есть свой смысл и "угловатости", во 
вторых при этой экономии порой поражаюсь 
вашей щедрости сударь, 4 байта на айдишник 
библиотеки ето ппц.... 2 байта хватит с 
головой (в принципе имхо можно и вообще 1 
сделать, но тут согласен еще можно 
поспорить). В третьих нет пакета 
"рукопожатия" в котором сервер и клиент 
смоглибы договориться о используемой 
версии протокола (в будущем при 
эксплуатации не соответствие версий 
клиента и сервера может стать фатальным). В 
пятых - я простил 4й пункт.... И наконец в 
шестых - я напрочь забыл что я хотел 
сказать, в седьмых - я уже сам не понимаю что 
пишу......

В соответствии со всем этим, с 
несущественными помарочками реализован 
следующий вариант протокола:

---------------------------------------------------------

С->S  0x00 ExHandshake
* BYTE   0x00    (Packet ID)
* DWORD     2    (Packet Size)        // для избежания 
проблем, при изменении размера пакета в 
будущем
* WORD      1    (Protocol version)   // версия протокола

В будущем в ответ сервер также может 
отсылать этот пакет клиенту. На данный 
момент сервер после получения данного 
пакета сразу отсылает клиенту пакет 0x01 и 0x02 
без ожидания запросов. Так же пока пакет не 
обязательный (сервер не будет ругаться 
если не получит его), но я рекомендую 
использовать его сразу - меньше проблем 
потом будет.

----------------------------------------------------------

С->S  0x01 LibraryList
* BYTE   0x01    (Packet ID)

Пакет запрашивает список библиотек (dll, plg), 
в ответ шлется пакет 0x01.

----------------------------------------------------------

S->C  0x01 LibraryList
* BYTE   0x01    (Packet ID)
* DWORD          (Packet Size)
* DWORD          (LOOP COUNTS)
START LOOP
* DWORD          (File Size)
* BYTE[16]       (md5 Checksum)
END LOOP

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

----------------------------------------------------------

С->S  0x02 PluginsList
* BYTE   0x02    (Packet ID)

Пакет запрашивает список плагинов, в ответ 
шлется пакет 0x02.

----------------------------------------------------------

S->C  0x02 PluginsList
* BYTE   0x02    (Packet ID)
* DWORD          (Packet Size)
* DWORD          (LOOP COUNTS)
START LOOP
* DWORD          (Library ID) - index библиотеки из списка в 
пакете 0x01
* BYTE           (Plugin ID) - index плагина в библиотеке
* BYTE           (Packets Count) - число пакетов, 
используемых плагином
END LOOP

Из существенного - см 0x01

----------------------------------------------------------

С->S  0x03 ReqdLibrary
* BYTE   0x03    (Packet ID)
* DWORD          (Packet Size)
* DWORD          (LOOP COUNTS)
START LOOP
* DWORD          (Library ID) - index библиотеки из списка в 
пакете 0x01
END LOOP

Смысл данного и следующего пакета я так и 
не уловил, при получении должно слаться в 
ответ 0x03, который по сути отсылает клиенту 
обратно что он и прислал.. Чисто логически 
дошел, что в ответ на каждое значение Library ID 
должен также отправлятся пакет 0х04. 

----------------------------------------------------------

S->C  0x03 ReqdLibrary
* BYTE   0x03    (Packet ID)
* DWORD          (Packet Size)
* BYTE   0x0/0x1 (Data Flag)
IF 'Data Flag' == 0 THEN
* DWORD          (LOOP COUNTS)
START LOOP
* DWORD          (Library ID) - index библиотеки из списка в 
пакете 0x01
END LOOP
END IF

Хоть убей не понял смысла...

----------------------------------------------------------

S->C  0x04 SendLibrary
* BYTE   0x04    (Packet ID)
* DWORD          (Packet Size)
* DWORD          (Library ID) - index библиотеки из списка в 
пакете 0x01
* BYTE           (Compress Type) - тип данных (0 - без сжатия 
(много весит), 1 - zip(золотая середина), 2 - 
bzip2(минимальный размер))
* BYTE[..]       (File data)

----------------------------------------------------------


АЛСО сервер пользуется следующими пакетами

----------------------------------------------------------

S->C  0xF0 ErrorPacket
* BYTE   0xF0    (Packet ID)
* DWORD          (Error Code) - код ошибки
* BYTE           (Packet Id) - Id пакета
* BOOL(=1 BYTE)  (Ext packet) - TRUE если пакет расширения 
(т.е. с вторичным ID), в противном случае FALSE
* WORD           (Packet Secondary ID) - вторичный ID пакета, 
например 0x1C.BF13 (в основном предназначены 
для плагинов)

Список кодов ошибок:
* 0x00000001 // UnknownPacket - Был получен не известный 
пакет (Также возможно ошибка парсинга)
* 0x00000002 // PacketTypeErr - Был получен не 
поддерживаемые пакет (Ошибка протокола, 
получен не поддерживаемый пакет)
* 0x00000004 // BadPacketsVer - Не поддерживаемая версия 
протокола (Конфликт версии клиент/сервера)
* 0xF0000000 // ClosingSocket - Уведомление о закрытии 
сокета (т.е. соединения)

Пакет информативный и не обязателен к 
реализации, но алсо полезен.

----------------------------------------------------------


PS В todo на будущее я бы предложил 
рассмотреть модель более сложной 
инициализации, когда учитывается "тип" 
пользователя. В этом есть определенный 
смысл - разрешать администрации, гмам и тд 
плагины что запрещены для пользователей. 
Такая ситуация может иметь место - ибо 
примеров что может быть полезно для работы 
но вредно для игры не мало...

Original comment by [email protected] on 17 May 2012 at 11:15

from uo-ext.

GoogleCodeExporter avatar GoogleCodeExporter commented on July 29, 2024
Несколько замечаний:
1) По поводу версии протокола... Да, наверно 
это - надо. Хотя версию протокола я засунул 
в 0xEF пакет, но судя по проблемам Сферы, 
проверку поддержки UOExt надо переделывать. 
Так как Сфера - дебил и там нельзя отвечать 
на пакеты к "логин серверу".
Походу придется делать эмуляцию логина.

2) По поводу размера... Я не теряю веры в то, 
что мы сможем засунуть работу плагинов 
внутрь сервера через спец пакет. Поэтому 
все что я тебе писал в Аське - было вытащено 
"из УОшного протокола". То есть считалось 
что "сверху" есть 3 байта: Пакет 
энкапсуляции и размер. Для поддержки этого 
предлагаю в каждом пакете в первых 2-х 
байтах слать размер, а потом хеадер пакета. 
То есть общий вид пакета:

* WORD PacketSize
* BYTE Header

Более того, так как генерация протокола 
будет автоматическая, то все "свои" пакеты 
надо засовывать в один хеадер, что и было 
сделано в оригинале. В этом случае 
"рукопожатие" будет выглядеть так:

С->S  0x00 Handshake
* WORD PacketSize = 5
* BYTE PacketHeader = 0x00
* BYTE InitializeSequence = 0x00
* BYTE ProtocolVersion = 0x00

Размер пакета в 2-х байтах для соответствия 
протоколу УО.

В ответ сервер отсылает пакет 
"подтверждения и настроек"

S->C  0x00 Handshake
* WORD PacketSize = 5
* BYTE PacketHeader = 0x00
* BYTE InitializeSequence = 0x00

В последствии сюда будут отдаваться те 
настройки, которые клиент не получил при 
коннекте к игровому серверу. Возможно, 
придется заставить игроков указывать 
именно этот порт в качестве игрового в 
Login.cfg и Разоре. Тогда тут будут отдаваться 
IP/Порт реального сервера.... Пока не знаю. 
Пусть пакет будет.

Дальше... Есть есть "пожатие руки", то запрос 
списка plg уже не нужен. Если все хорошо, то 
сервер сразу отсылает пакет со списком plg.

S->C  0x01 LibraryList
* WORD PacketSize
* BYTE PacketHeader = 0x00
* BYTE InitializeSequence = 0x01
START LOOP
* DWORD          (File Size)
* BYTE[16]       (md5 Checksum)
END LOOP

Так как размер пакета есть, то луп 
посчитать можно и так. Далее... Забили на 
запрос клиента о списке плагинов.  Более 
того, максимум в списке plg: ( 65535 - 4(5) ) / 17 = 3854 
plg, так что Id библиотеки ужимаем до 2-х байт. 
И отправляем пакет сразу, не ожидая запроса:

S->C  0x02 PluginsList
* WORD PacketSize
* BYTE PacketHeader = 0x00
* BYTE InitializeSequence = 0x02
START LOOP
* WORD          (Library ID) - index библиотеки из списка в 
пакете 0x01
* BYTE           (Plugin ID) - index плагина в библиотеке
* BYTE           (Packets Count) - число пакетов, 
используемых плагином
END LOOP

Дальше клиент ДОЛЖЕН послать запрос со 
списком желаемых plg. Он может быть и пустым:

С->S  0x03 ReqdLibrary
* WORD PacketSize
* BYTE PacketHeader = 0x00
* BYTE InitializeSequence = 0x03
START LOOP
* WORD          (Library ID) - index библиотеки из списка в 
пакете 0x01
END LOOP

Этим пакетом клиент указывает что у него 
нету в кеше тех или иных plg. Пакет является 
информативным и сервер МОЖЕТ не доверять 
ему, пересылая все plg. Клиент ДОЛЖЕН в этом 
случае перезаписать кеш.

Дальше я писал немного по другому. В ответ 
на клиентский пакет сервер шлет сами plg... 
Для этого он использует 2 пакета:

S->C  0x03 PlgHeader
* WORD PacketSize
* BYTE PacketHeader = 0x00
* BYTE InitializeSequence = 0x03
* WORD PluginID
* BYTES Content

Если dll не уместилась в этот пакет, то сразу 
после этого шлются дополнительные пакеты:

S->C  0x04 PlgContent
* WORD PacketSize
* BYTE PacketHeader = 0x00
* BYTE InitializeSequence = 0x04
* BYTES Content


По поводу Твоего туду: Такие 
"администраторские" плагины можно потом 
включать с сервера при валидации 
пользователя спец пакетом. Единственно 
что... Если такие плагины должны что-то 
сделать до инициализации клиента. Но тут 
думать надо.

Original comment by [email protected] on 18 May 2012 at 5:31

from uo-ext.

GoogleCodeExporter avatar GoogleCodeExporter commented on July 29, 2024
Сейчас подумал... В таком случае будет 
проблема, когда сервер решил не отсылать 
клиенту ни одного пакета. Однако мы все еще 
держим подключение, так как сейчас будут 
работать плагины... Добавим еще один пакет:

S->C: 0x05 InitializationComplete
* WORD PacketSize = 4(5)
* BYTE PacketHeader = 0x00
* BYTE InitializeSequence = 0xFF

Original comment by [email protected] on 18 May 2012 at 1:23

from uo-ext.

GoogleCodeExporter avatar GoogleCodeExporter commented on July 29, 2024

Original comment by [email protected] on 26 May 2012 at 5:28

  • Changed state: Done

from uo-ext.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.