Comments (5)
Никакого патриотизма, даже задачи для
своих же земляков на английском и это при
полном отсутствии буржуев...
Original comment by [email protected]
on 15 May 2012 at 10:25
from uo-ext.
Сразу о бардаке что творится с протоколом...
он мне не нравится: Во первых если пакет
имеет динамичный размер то он должен
ставиться после 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.
Несколько замечаний:
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.
Сейчас подумал... В таком случае будет
проблема, когда сервер решил не отсылать
клиенту ни одного пакета. Однако мы все еще
держим подключение, так как сейчас будут
работать плагины... Добавим еще один пакет:
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.
Original comment by [email protected]
on 26 May 2012 at 5:28
- Changed state: Done
from uo-ext.
Related Issues (20)
- Core: Downloading packet acknowledgment HOT 2
- Server works only under windows HOT 3
- Fall back mecanics for old emulators HOT 1
- Change UOExt.GUI image. HOT 2
- gunzip issue HOT 2
- UOExtServer x64 support HOT 1
- connect from plug-ins override by UOExt HOT 2
- Allow plugins register another libraries in PE_INIT HOT 3
- One plugin library load at start HOT 3
- Plugins update and load plugin HOT 2
- Testing - RC3 HOT 5
- Thread safe call for any API HOT 3
- Update server refactoring HOT 1
- GUI - allow common command passage through UOExt HOT 1
- Standalone server: If no m_ip set - assume all avail IPs HOT 1
- New API "hooks" for protocol stream
- Switch protocol decryption API to separate plugin
- MULApi
- Change home page. HOT 1
- Automatic protocol detection HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from uo-ext.