Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Socket
#1
Всем доброго времени!Smile

Пожалуйста знатоки подскажите.

Порт 2106 закрыт.
После запуска Login server'a он его открывает.

Я никак не могу понять, "Игровой клиент", он отправляет данные на открытый сокет Login-server'a ?

Или, что там происходит, мне очень хочется это знать.
Пожалуйста объясните...

Как там происходит взаимодействие клиент с login-server'om.
И для чего еще один порт 9014?



И еще пожалуйста, кто-нибудь скажите где в коде происходит обработка кнопки "Войти"?



Прошу помогите пожалуйста! Будьте так сказачна любезны Wink
Ответ
#2
реакция на кнопку пойти - обрабатывается в логине, пакет - RequestAuthLogin
порт 9014 используется для связи login<->server
Ответ
#3
linliss Написал:реакция на кнопку пойти - обрабатывается в логине, пакет - RequestAuthLogin
порт 9014 используется для связи login<->server

Спасибо, но там оторвано еще куда, то видимо...

Само нажатие ивента так и не увидел, или там не так?)

Объясните как, вообще запутался.

Там столько кода и файлов, это же вообще жесть.

Взял чисто случайно сборку с исходами l2jfrozen.


Кто писал сервер себя не жалел видимо...
А других темболее.


У меня главная проблема, это вот эта, все остальное нет проблем.
Разобрался.

А вот с этими соединениями никак не могу понять.


Прошу можешь поподробнее объяснить!?Smile
Ответ
#4
Объяснить могу попробовать йа. Значится, сетевой обмен "клиент-сервер" выглядит примерно следующим образом (в общих чертах, конечно)...

Со стороны клиента: Посылка какого-либо запроса - это почти всегда реакция на какое либо действие пользователя. В общем случае, при нажатии на что-либо, клиент формирует пакет, привязанный к этому "что-либо", заполняя его поля значениями в определенном порядке (это, например, имя аккаунта и хеш от пароля для реквестАутЛогин), шифрует и кидает "на шину". Естественно, при таком раскладе, никаких эвентов нажатий (боже мой, делфи, что ли?) вы не найдете, поскольку исходников клиентской части у вас банально нет.

Зато у вас имеются исходники серверной части. И вот тут уже всё несколько более прозрачно.
Обычно джава-сервера используют "либу" mmocore, которая предоставляет набор базовых сетевых функций, в каком-то роде "заточенных" под многопользовательскую платформу... Затем к этой либе аттачится криптомодуль, который по получении пакета расшифровывает содержимое и отправляет на обработку.
Дальше происходит совсем уж примитивная вещь - большой такой, допустим, оператор выбора по значению первого байта полезной нагрузки пакета... Благодаря этому первому байту, происходит осознание того, что делать со всеми остальными байтами, и какая у них смысловая нагрузка.
Соответственно, когда мы понимаем, какой пакет к нам пришел, мы дергаем соответствующую функцию-обработчик, которая (как правило) и обеспечивает нам реакцию на событие - то есть отсылку данных клиенту. Клиент в свою очередь делает нечто похожее. И так далее.

И поскольку у вас есть исходники, реакцию на событие со стороны сервера можно модифицировать... А можно не модифицировать, и оставить "как есть", до обретения просветления в этой области.

Помимо этого, сервер может отправлять клиенту данные не благодаря запросам от оного, но благодаря реализованным алгоритмам... (такие вещи, как запуск анимации заклинания, например, другими персонажами).

Надеюсь, изложил более-менее понятно, хотя старался как можно короче, и поэтому многое (например, как именно происходит идентификация клиента) я просто опустил "для ясности" Smile
Если бы в Java работал GC, большинство программ удаляли бы сами себя при первом же запуске
Ответ
#5
В том, то все и дело, я не пойму, что там куда отправляется и где, что принимается...

Вообще не врубэйшен.
Можешь помочь разобраться!?

Ну пробую представить:

Я жму вход, что там формируется, пакет?

Мне бы понять бы как вот это устроенно, все все вопросы бы сразу отпали...

У меня в этом только сложность, я не пойму как там устроенна связь, а очень нужно...

Помогите! Кто, чем сможет, может быть детально информация есть?!

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

Конкретно хочу понять как работает.

Мне только это и нужно....

Большое спасибо, что помогаете.

Прошу постарайтесь разжевать и если можно показать, примером, будет вообще супер.

Благодарю, за все, очень сильно помогаете.
Ответ
#6
После нажатия кнопки войти - клиент устанавливает соединение с логин сервером. После того, как соединение установлено - начинается обмен пакетами.
Первый пакет отсылает логин сервер, Это пакет LoginInit(0x00), в котором отсылается открытый RSA ключ, blowFish ключ, и так называемый идентификатор сессии(sessionId).
Клиент в ответ на этот пакет присылает пакет AuthGameGuard, в котором возвращает sessionId.
Если он совпадает с отосланым, сервер отсылает пакет GGAuth, в ответ на который клиент присылает RequestAuthLogin, который содержит в себе логин и пароль игрока, зашифрованные с помощью отосланного ранее открытого RSA ключа.

Ещё раз кратко:
©lient: -> (L)oginserver: Запрос на подключение
Логин сервер устанавливает соединение...
L -> C: LoginInit
C -> L: AuthGameGuard
L -> C: GGAuth
C -> L: RequestAuthLogin
Ответ
#7
Ох-хо... Обычно, если люди хотят понять, как работает "вообще сеть", я рекомендую какой-нить ваершарк. Сниффер такой.

А в случае с линеечкой, думаю, более чем идеально подойдет l2ph. Его можно скачать, поставить, запустить, и с его помощью наглядно собственными глазами увидеть, "пошчупать", что, куда, когда и даже "зачем" посылается.

А читать курс о сетях, сетевых протоколах, конкретном протоколе конкретной игры и разработке софта с реалиацией оного протокола, а также о языках программирования высокого уровня вообще, джаве в частности и ОО-подходе к разработке у меня банально нет ни времени, ни желания, уж не обессудьте.
Если бы в Java работал GC, большинство программ удаляли бы сами себя при первом же запуске
Ответ
#8
Camelion Написал:После нажатия кнопки войти - клиент устанавливает соединение с логин сервером. После того, как соединение установлено - начинается обмен пакетами.
Первый пакет отсылает логин сервер, Это пакет LoginInit(0x00), в котором отсылается открытый RSA ключ, blowFish ключ, и так называемый идентификатор сессии(sessionId).
Клиент в ответ на этот пакет присылает пакет AuthGameGuard, в котором возвращает sessionId.
Если он совпадает с отосланым, сервер отсылает пакет GGAuth, в ответ на который клиент присылает RequestAuthLogin, который содержит в себе логин и пароль игрока, зашифрованные с помощью отосланного ранее открытого RSA ключа.

Ещё раз кратко:
©lient: -> (L)oginserver: Запрос на подключение
Логин сервер устанавливает соединение...
L -> C: LoginInit
C -> L: AuthGameGuard
L -> C: GGAuth
C -> L: RequestAuthLogin


О как уже начинаю, понимать!

Большущее, спасибо...



Gubble, я все конечно понимаю, но если нет желания, то конечно я не настаиваю.

Думаю, возможно найдутся, те, у кого будет хоть, немного желания...

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


Camelion, Большое спасибо за подсказку....

LoginInit... А вот его я что-то не увидел, GGAuth такой класс имеется.

RSA - откуда берется? blowFish, а это?)
Ответ
#9
Попробуйте вместо LoginInit поискать просто Init.
RSA и BlowFish ключи генерируются в нужные моменты. У меня этим занимается вот такой класс:
PHP код:
<?php 
public final class KeyGenerator {

/**
* Генерирует RSA ключи
*/
public static ScrambledKeyPair generateScrambledKeyPair() {
KeyPairGenerator keygen;
try {
keygen = KeyPairGenerator.getInstance("RSA");
RSAKeyGenParameterSpec spec = new RSAKeyGenParameterSpec(1024, RSAKeyGenParameterSpec.F4);
keygen.initialize(spec);
} catch (
NoSuchAlgorithmException | InvalidAlgorithmParameterException e) {
e.printStackTrace();
return
null;
}
return new
ScrambledKeyPair(keygen.generateKeyPair());
}

/**
* Генерирует Blowfish ключ
*
* @return blowFish ключ
*/
public static byte[] generateBlowfishKey() {
byte[] key = new byte[16];
for (
int i = 0; i < key.length; i++) {
key[i] = (byte) (Rnd.get(255) + 1);
}
return
key;
}
}
Ответ
#10
Camelion, ну хоть теперь уже становится более наглядно и понятно...
Спасибо, что помогаешь...


Там такой ужас, что вообще =)
Разветвлений там просто даталова много...

Понапичкано, там наверное можно сидеть, щелкать, щелкать, щелкать и конца не увидешь...
Куда столько...

Init класс нашел:


Что-то там все так запутанно, что просто дурдом какой-то.
Толи, специально, толи, что не пойму, куда столько классов и методов.


Есть по легче сборка с открытыми исходами?

Еще так пишут пахабно...

Вот, что то тут тоже видимо.

PHP код:
<?php 
private LoginController() throws GeneralSecurityException
{
Util.printSection("LoginController");

_hackProtection = new FastMap<InetAddress, FailedLoginAttempt>();

_keyPairs = new ScrambledKeyPair[10];
KeyPairGenerator keygen = null;

keygen = KeyPairGenerator.getInstance("RSA");
RSAKeyGenParameterSpec spec = new RSAKeyGenParameterSpec(1024, RSAKeyGenParameterSpec.F4);
keygen.initialize(spec);

//generate the initial set of keys
for(int i = 0; i < 10; i++)
{
_keyPairs[i] = new ScrambledKeyPair(keygen.generateKeyPair());
}

_log.info("Cached 10 KeyPairs for RSA communication");

testCipher((RSAPrivateKey) _keyPairs[0]._pair.getPrivate());

// Store keys for blowfish communication
generateBlowFishKeys();

spec = null;
keygen = null;
new
ConnectionChecker().start();
}

Запутанно все...





Серьезно, есть ли полегче сборки?
Ответ


Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)