Работа с пакетами — различия между версиями
Материал из Perfect World Develop Wiki
Строка 1: | Строка 1: | ||
+ | {| class="wikitable" border="1" width=100% | ||
+ | |- | ||
+ | ! colspan="3" | Пакеты / Packets | ||
+ | |- | ||
+ | ! Сервис / Service | ||
+ | ! Ссылки / Links | ||
+ | ! Комментарий / Note | ||
+ | |- | ||
+ | ! rowspan="2" | gdeliveryd | ||
+ | | [[gdeliveryd ProtocolType|ProtocolType]] | ||
+ | | rowspan="2" | 1.1.6 v6 — 1.5.5 v156 | ||
+ | |- | ||
+ | | [[gdeliveryd CallID|CallID]] | ||
+ | |- | ||
+ | ! rowspan="2" | gamedbd | ||
+ | | [[gamedbd ProtocolType|ProtocolType]] | ||
+ | | rowspan="2" | 1.5.1 v101 | ||
+ | |- | ||
+ | | [[gamedbd CallID|CallID]] | ||
+ | |- | ||
+ | ! rowspan="2" | uniquenamed | ||
+ | | [[uniquenamed ProtocolType|ProtocolType]] | ||
+ | | rowspan="2" | 1.5.1 v101 | ||
+ | |- | ||
+ | | [[uniquenamed CallID|CallID]] | ||
+ | |} | ||
+ | Список пакетов из gdeliveryd, gamedbd и uniquenamed воссоздан парсингом отладочной информации ([http://en.wikipedia.org/wiki/DWARF DWARF]). Список и структуры пакетов актуальны для всех версий. Для пакетов сделаны зависимости друг от друга — легко найти пакет, который придет от сервера как ответ, и наоборот. Зависимости отображаются на страницах пакетов. Для каждого сервиса предоставлены списки ProtocolType и CallID, пакеты из последнего можно вызывать только со стороны сервера. | ||
+ | |||
== Структура пакетов == | == Структура пакетов == | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Строка 15: | Строка 43: | ||
|} | |} | ||
− | == | + | == PHP == |
− | + | * [[Код класса PHP для работы с пакетами]] | |
− | + | === Пример работы === | |
+ | Для примера рассмотрим получение никнейма персонажа по его ID из сервиса gamedbd через пакет [[GetRoleBaseArg]]. | ||
+ | <syntaxhighlight lang="php"><? | ||
+ | include("packet_class.php"); | ||
+ | $GetRoleBase = new WritePacket(); | ||
+ | $GetRoleBase -> WriteUInt32(-1); // always for gamedbd | ||
+ | $GetRoleBase -> WriteUInt32(1024); // roleid | ||
+ | $GetRoleBase -> Pack(0xBC5); // opcode | ||
+ | |||
+ | if (!$GetRoleBase -> Send("localhost", 29400)) // send to gamedbd | ||
+ | return; | ||
− | == | + | $GetRoleBase_Re = new ReadPacket($GetRoleBase); // reading packet from stream |
− | + | $packetinfo = $GetRoleBase_Re -> ReadPacketInfo(); // read opcode and length | |
+ | $GetRoleBase_Re -> ReadUInt32(); // always | ||
+ | $GetRoleBase_Re -> ReadUInt32(); // retcode | ||
+ | $GetRoleBase_Re -> ReadUByte(); // version | ||
+ | $GetRoleBase_Re -> ReadUInt32(); // id | ||
+ | echo $GetRoleBase_Re -> ReadUString(); // show rolename | ||
+ | ?></syntaxhighlight> | ||
+ | === Замечания по WritePacket === | ||
+ | * Для работы с пакетами gdeliveryd следует установить true значению passestablished. | ||
+ | <syntaxhighlight lang="php">... | ||
+ | $packet = new WritePacket(); | ||
+ | $packet -> passestablished = true; | ||
+ | ...</syntaxhighlight> | ||
+ | * Для игнорирования ответного пакета (применительно к пакетам, у которых вообще нет ответных) следует установить false значению getresponse. | ||
+ | <syntaxhighlight lang="php">... | ||
+ | $packet = new WritePacket(); | ||
+ | $packet -> getresponse = false; | ||
+ | ...</syntaxhighlight> |
Версия 14:35, 19 июня 2018
Пакеты / Packets | ||
---|---|---|
Сервис / Service | Ссылки / Links | Комментарий / Note |
gdeliveryd | ProtocolType | 1.1.6 v6 — 1.5.5 v156 |
CallID | ||
gamedbd | ProtocolType | 1.5.1 v101 |
CallID | ||
uniquenamed | ProtocolType | 1.5.1 v101 |
CallID |
Список пакетов из gdeliveryd, gamedbd и uniquenamed воссоздан парсингом отладочной информации (DWARF). Список и структуры пакетов актуальны для всех версий. Для пакетов сделаны зависимости друг от друга — легко найти пакет, который придет от сервера как ответ, и наоборот. Зависимости отображаются на страницах пакетов. Для каждого сервиса предоставлены списки ProtocolType и CallID, пакеты из последнего можно вызывать только со стороны сервера.
Структура пакетов
Тип данных | Название |
---|---|
CUInt | Opcode |
CUInt | Length |
byte[] | Content |
PHP
Пример работы
Для примера рассмотрим получение никнейма персонажа по его ID из сервиса gamedbd через пакет GetRoleBaseArg.
<? include("packet_class.php"); $GetRoleBase = new WritePacket(); $GetRoleBase -> WriteUInt32(-1); // always for gamedbd $GetRoleBase -> WriteUInt32(1024); // roleid $GetRoleBase -> Pack(0xBC5); // opcode if (!$GetRoleBase -> Send("localhost", 29400)) // send to gamedbd return; $GetRoleBase_Re = new ReadPacket($GetRoleBase); // reading packet from stream $packetinfo = $GetRoleBase_Re -> ReadPacketInfo(); // read opcode and length $GetRoleBase_Re -> ReadUInt32(); // always $GetRoleBase_Re -> ReadUInt32(); // retcode $GetRoleBase_Re -> ReadUByte(); // version $GetRoleBase_Re -> ReadUInt32(); // id echo $GetRoleBase_Re -> ReadUString(); // show rolename ?>
Замечания по WritePacket
- Для работы с пакетами gdeliveryd следует установить true значению passestablished.
... $packet = new WritePacket(); $packet -> passestablished = true; ...
- Для игнорирования ответного пакета (применительно к пакетам, у которых вообще нет ответных) следует установить false значению getresponse.
... $packet = new WritePacket(); $packet -> getresponse = false; ...