Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   MaNGOSZero (1.12.X) (http://mangos.ytdb.ru/forumdisplay.php?f=48)
-   -   1.12.1 realmlist (http://mangos.ytdb.ru/showthread.php?t=6279)

Archon64 07.10.2012 21:09

1.12.1 realmlist
 
Доброго времени суток. Скажите пожалуйста, по какой причине клиент может зависать на табличке Success! (Retviewing realmlist).
Шлю вроде правильный пакет. Для полной уверенности, решил произвести проверку.
1) Просниффил что мне шлёт 100% рабочий сервер.
2) Поменял у себя в конфиге имя и адрес, на имя и адрес того рабочего сервера.
3) Проснифил что шлю я и сравнил.
Результат таков:
Код:

10 35 00 00 00 00 00 01 01 00
00 00 00 45 6D 65 72 61 6C 64
20 44 72 65 61 6D 00 39 35 2E
32 31 31 2E 31 32 33 2E 31 38
31 3A 38 39 39 37 00 A4 70 FD
3E
01 01 00 02 00

Это шлёт 100% рабочий сервер, при коннекте к которому у меня выпрыгивает список реалмов.
Код:

10 35 00 00 00 00 00 01 01 00
00 00 00 45 6D 65 72 61 6C 64
20 44 72 65 61 6D 00 39 35 2E
32 31 31 2E 31 32 33 2E 31 38
31 3A 38 39 39 37 00 0A D7 A3
3C
01 01 00 02 00

Это шлёт мой "сервер", при коннекте к которому клиент "зависает" на "Success! (Retviewing realmlist)".
Отличительные 4 байта - это заселение(realm population) сервера типа float. В связи с этим, могу предположить, что проблема не в REALM_LIST(0x10) пакете. Буду очень благодарен за помощь.

Amaru 09.10.2012 08:00

Ну надо посмотреть, что шлет клиент после получения этого опкода.
Success обычно висит, когда нет ответа от чар сервера.

Sid 09.10.2012 08:15

Клиент делает запрос на world сервер на другой порт уже, и запрашивает список персонажей. У тебя кроме реалм-сервера world тоже написан? :)

Archon64 09.10.2012 19:10

"world" сервер не запущен. Но не выпрыгивает даже список реалмов, который клиенту отослал сервер авторизации. Я глубоко сомневаюсь, что перед тем, как показать юзеру список реалмов клиент пытается связаться с каждым из них. Так же я пробовал дать реалму флаг OFFLINE, но это не помогло. А так же, в сниффах клиент не шлёт никакие данные реалмам, которые прислал ему сервер авторизации, да и вообще, после приёма 0x10 пакета, клиент не шлёт никакие данные никуда. Возможно я неправильно сниффы собираю, используя WPE PRO?

RomanRom2 09.10.2012 20:47

клиент то прислал запрос на лист? код $10.

Archon64 09.10.2012 22:34

Вложений: 1
Цитата:

Сообщение от RomanRom2 (Сообщение 29771)
клиент то прислал запрос на лист? код $10.

Да, конечно. Я об этом и говорю - клиент шлёт запрос на лист, я шлю в ответ нормальный пакет, а на клиенте висит Success! На скриншоте видно, что после того, как клиент принял 0х10 пакет, он больше ничего не шлёт, вися при этом на Success!

RomanRom2 10.10.2012 08:39

ну вы шлете бездумно неправильный пакет. копипаста, так сказать.
вы говорите клиенту о том, что сейчас будет 53 реалмов в листе, а передаете один. вот он и висит, ожидая данные.

Evgeniy 10.10.2012 09:12

если пакет не менялся то 53 - число байт нужное для сохранения данных.
В данной ситуации происходит обычное явление, клиент уже логинился на данный игровой сервер, и автоматически пытается к нему же и залогинится, но так как игровой сервер не доступен так и висит.

Sid 10.10.2012 10:28

Тогда бы выдал список, даже если состоит из одного реалма. Что-то с данными в пакете не так, float и строу с названием реалма правильно сериализировал? У меня самописный логин сервак на чистом Qt работает как часы.

RomanRom2 10.10.2012 12:09

а, да да да, правильно, 53 - это размер данных.
ну тогда пакет правильный. возможно в коде отправки ошибка.
значение флоата там не имеет значения. это поле вообще очень хитрое, его нельзя тупо слать тупо какое то значение, это неправильно. читайте луа-скрипты, поймете как он работает на самом деле.

Archon64 10.10.2012 16:41

Цитата:

Сообщение от RomanRom2 (Сообщение 29779)
а, да да да, правильно, 53 - это размер данных.
ну тогда пакет правильный. возможно в коде отправки ошибка.
значение флоата там не имеет значения. это поле вообще очень хитрое, его нельзя тупо слать тупо какое то значение, это неправильно. читайте луа-скрипты, поймете как он работает на самом деле.

Я пытался слать значение 0.02 и 0.0 - результат одинаков. Можно поподробнее про этот float и "lua-скрипты"? Впервые слышу.
Цитата:

Сообщение от Sid (Сообщение 29777)
Тогда бы выдал список, даже если состоит из одного реалма. Что-то с данными в пакете не так, float и строу с названием реалма правильно сериализировал? У меня самописный логин сервак на чистом Qt работает как часы.

Незнаю честно говоря, правильно ли его сериализовал. Использую BinaryWriter в C#. Инты, лонги нормально сериализует, не думаю, что с флоатом какие-то проблемы.

Цитата:

Сообщение от Evgeniy (Сообщение 29776)
если пакет не менялся то 53 - число байт нужное для сохранения данных.
В данной ситуации происходит обычное явление, клиент уже логинился на данный игровой сервер, и автоматически пытается к нему же и залогинится, но так как игровой сервер не доступен так и висит.

По логам видно, что клиент после принятия 0х10 пакета ничего и никуда не шлёт. При клике на cancel, Success! заменяется на Retviewing Realmlist, клиент шлёт 0х10 снова, снова принимает нормальный пакет, а список реалмов так и не появляется. Повторюсь, что я выставлял флаг OFFLINE для реалма.

Evgeniy 10.10.2012 16:53

Цитата:

Сообщение от Archon64 (Сообщение 29787)
По логам видно, что клиент после принятия 0х10 пакета ничего и никуда не шлёт. При клике на cancel, Success! заменяется на Retviewing Realmlist, клиент шлёт 0х10 снова, снова принимает нормальный пакет, а список реалмов так и не появляется. Повторюсь, что я выставлял флаг OFFLINE для реалма.

ясен пень что не шлет - слать некуда.
смени имя реалма и увидишь, что клиент перестанет виснуть.

MaS0n 10.10.2012 21:48

Я проверял, запускал логин сервер без ворлд, список реалмов все равно показывает, да судя по коду клиента - коннект происходит только после выбора реалма

луа-функции, имеется в виду базовая связь клиента с его же интерфейсом, а именно мы шлем пакет например, активизируем луа эвент этим, луа эвент заранее зарегистрован в интерфейсе, и интерфейс уже нам создает и список реалмов каким мы его видим и всю отрисовку текста, кнопочки и т.д

Типа такого
Код:

int __cdecl Lua_RequestRealmList(int a1)
{
  int v2; // eax@1

  v2 = FrameScript__GetParamValue(a1, 1, 0);
  CGlueMgr__GetRealmList(v2);
  return 0;
}

А это уже код интерфейса
Код:

function RealmList_OnLoad()
        this:RegisterEvent("OPEN_REALM_LIST");
        this.currentRealm = 0;
        this.offset = 0;
end

function RealmList_OnEvent()
        if ( event == "OPEN_REALM_LIST" ) then
                if ( this:IsVisible() ) then
                        RealmListUpdate();
                else
                        this:Show();
                end
        end
end

Вот как интерфейс запрашивает инфу о реалме

Код:

name, numCharacters, invalidRealm, realmDown, currentRealm, pvp, rp, load = GetRealmInfo(RealmList.selectedCategory, realmIndex);
Посмотрите сами, Interface/GlueXML/Realmlist.lua

Я сам в недоумении, думаю сериализация тут ни при чем, попробуйте сами собрать пакет, без сравнений с прочими работающими и отснифанными

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

Archon64 27.10.2012 03:35

Цитата:

Сообщение от MaS0n (Сообщение 29790)
Я проверял, запускал логин сервер без ворлд, список реалмов все равно показывает, да судя по коду клиента - коннект происходит только после выбора реалма

луа-функции, имеется в виду базовая связь клиента с его же интерфейсом, а именно мы шлем пакет например, активизируем луа эвент этим, луа эвент заранее зарегистрован в интерфейсе, и интерфейс уже нам создает и список реалмов каким мы его видим и всю отрисовку текста, кнопочки и т.д

Типа такого
Код:

int __cdecl Lua_RequestRealmList(int a1)
{
  int v2; // eax@1

  v2 = FrameScript__GetParamValue(a1, 1, 0);
  CGlueMgr__GetRealmList(v2);
  return 0;
}

А это уже код интерфейса
Код:

function RealmList_OnLoad()
        this:RegisterEvent("OPEN_REALM_LIST");
        this.currentRealm = 0;
        this.offset = 0;
end

function RealmList_OnEvent()
        if ( event == "OPEN_REALM_LIST" ) then
                if ( this:IsVisible() ) then
                        RealmListUpdate();
                else
                        this:Show();
                end
        end
end

Вот как интерфейс запрашивает инфу о реалме

Код:

name, numCharacters, invalidRealm, realmDown, currentRealm, pvp, rp, load = GetRealmInfo(RealmList.selectedCategory, realmIndex);
Посмотрите сами, Interface/GlueXML/Realmlist.lua

Я сам в недоумении, думаю сериализация тут ни при чем, попробуйте сами собрать пакет, без сравнений с прочими работающими и отснифанными

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

Спасибо. Пакет собираю сам, конечно же. После того, как не увидел реалмлиста решил сравнить с 100% правильным пакетом.

Всем спасибо за многие разъяснения, решение проблемы нашёл. Вся беда была совершенно в другом 0х01 пакете приходящем от сервера, вторая стадия авторизации (что странно, т.к. после принятия неправильного 0х01 пакета, клиент шлёт сервера запрос реалм-листа 0х10).

Я считал что его структура такова:
Код:

0x0        uint8        Command       
0x1        uint8        Error       
0x2        uint8[20]        M2       
0x16        uint32        unk1       
0x1A        uint32        unk2       
0x1E        uint16        unk3

Оказалось что там были лишние 6 байтов.


Текущее время: 09:34. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS