Работа с пакетами — различия между версиями

Материал из 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 ==
{{main|Список пакетов}}
+
* [[Код класса PHP для работы с пакетами]]
Список пакетов из gdeliveryd, gamedbd и uniquenamed воссоздан парсингом отладочной информации ([http://en.wikipedia.org/wiki/DWARF DWARF]). Список и структуры пакетов актуальны для всех версий. Для пакетов сделаны зависимости друг от друга — легко найти пакет, который придет от сервера как ответ, и наоборот. Зависимости отображаются на страницах пакетов. Для каждого сервиса предоставлены списки ProtocolType и CallID, пакеты из последнего можно вызывать только со стороны сервера.
+
=== Пример работы ===
 +
Для примера рассмотрим получение никнейма персонажа по его 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
{{main|Примеры работы с пакетами}}
+
$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;
...