Работа с пакетами
Материал из Perfect World Develop Wiki
Версия от 14:36, 19 июня 2018; DesmondHume (обсуждение | вклад)
Пакеты / 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, пакеты из последнего можно вызывать только со стороны сервера.
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; ...