Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Работа со скриптами (https://forum.zone-game.info/forumdisplay.php?f=37)
-   -   Socket (https://forum.zone-game.info/showthread.php?t=22171)

norton 16.08.2012 19:38

Socket
 
Всем доброго времени!:)

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

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

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

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

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



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



Прошу помогите пожалуйста! Будьте так сказачна любезны ;)

linliss 16.08.2012 19:48

Re: Socket
 
реакция на кнопку пойти - обрабатывается в логине, пакет - RequestAuthLogin
порт 9014 используется для связи login<->server

norton 16.08.2012 20:15

Re: Socket
 
Цитата:

Сообщение от linliss (Сообщение 217378)
реакция на кнопку пойти - обрабатывается в логине, пакет - RequestAuthLogin
порт 9014 используется для связи login<->server

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

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

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

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

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


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


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

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


Прошу можешь поподробнее объяснить!?:)

Gubble 16.08.2012 20:42

Re: Socket
 
Объяснить могу попробовать йа. Значится, сетевой обмен "клиент-сервер" выглядит примерно следующим образом (в общих чертах, конечно)...

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

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

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

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

Надеюсь, изложил более-менее понятно, хотя старался как можно короче, и поэтому многое (например, как именно происходит идентификация клиента) я просто опустил "для ясности" :)

norton 16.08.2012 20:58

Re: Socket
 
В том, то все и дело, я не пойму, что там куда отправляется и где, что принимается...

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

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

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

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

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

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

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

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

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

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

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

Благодарю, за все, очень сильно помогаете.

Camelion 16.08.2012 21:40

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

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

Gubble 16.08.2012 21:42

Re: Socket
 
Ох-хо... Обычно, если люди хотят понять, как работает "вообще сеть", я рекомендую какой-нить ваершарк. Сниффер такой.

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

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

norton 16.08.2012 22:00

Re: Socket
 
Цитата:

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

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


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

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



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

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

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


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

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

RSA - откуда берется? blowFish, а это?)

Camelion 16.08.2012 22:06

Re: Socket
 
Попробуйте вместо LoginInit поискать просто Init.
RSA и BlowFish ключи генерируются в нужные моменты. У меня этим занимается вот такой класс:
PHP код:

public final class KeyGenerator {

    
/**
     * Генерирует RSA ключи
     */
    
public static ScrambledKeyPair generateScrambledKeyPair() {
        
KeyPairGenerator keygen;
        try {
            
keygen KeyPairGenerator.getInstance("RSA");
            
RSAKeyGenParameterSpec spec = new RSAKeyGenParameterSpec(1024RSAKeyGenParameterSpec.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 0key.lengthi++) {
            
key[i] = (byte) (Rnd.get(255) + 1);
        }
        return 
key;
    }



norton 16.08.2012 23:08

Re: Socket
 
Camelion, ну хоть теперь уже становится более наглядно и понятно...
Спасибо, что помогаешь...


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

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

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


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


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

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

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

PHP код:

private LoginController() throws GeneralSecurityException
    
{
        
Util.printSection("LoginController");

        
_hackProtection = new FastMap<InetAddressFailedLoginAttempt>();

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

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

        
//generate the initial set of keys
        
for(int i 010i++)
        {
            
_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();
    } 

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





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


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

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot