четверг, 10 марта 2011 г.

Разбираем процесс сетевого общения в деталях. Эпизод 2.


Наших знаний пока что хватило на то, чтобы связаться с сервером и получить хоть что-то от него вразумительное в ответ. Теперь же, чтобы продвигаться дальше нужно разузнать, что все-таки отвечает сервер, как это обрабатывать и какой запрос посылать следующим.
Как уже нам известно сервер в ответ на приветствие должен прислать «CFCFCFCF» + Х. В след за этим нужно послать запрос «CACACACA»+ Х. Допустим что «Х» это одно и то же. Попробуем выделять кусок после «CFCFCFCF» и отправлять его, только в начало поставив «CACACACA».
Для удобства заведем массив header[5], куда будем складывать первые 4 полученных байта. Поскольку уже видно, что каждое сообщение передаваемое от сервера к клиенту и обратно имеет постоянную часть и часть, которая может изменяться. И, соответственно, каждый раз когда приходит сообщение будем смотреть на его заголовок, а уж потом разбираться что будем с ним делать.
В результате должно получиться что-то вроде:

Прежде чем запустить пример, нужно поставить NPA в режим захвата локального трафика. Ну что, попробуем?
Ответ сервера на приветствие:

Пробуем послать тоже самое, изменив заголовок:

Ответ один и тот же:


И так повторяя раз за разом, можно убедиться, что исходное предположение о том, «что пришло в теле сообщения то и отправляем серверу» неверно. Нам постоянно приходят сообщения с заголовком «DF DF DF DF» + X + Y. Думаю, что нетрудно заметить, что X везде одинаковый. В нашем примере это «13 E0 58 9E».

Посмотрим за процессом общения настоящего клиента и сервера. Запускам клиент игры. Подключаемся. Стреляем. Отключаемся. Что нас интересует? Прокручиваем весь список отправленных сообщений до конца. И видим, что общение всегда заканчивается сообщением с заголовком «DF DF DF DF». Только этот пакет посылает клиент. Получается, мы узнали две важных вещи.
1)      «DF DF DF DF» - это заголовок пакета, которым завершается общение между клиентом и сервером. Послать его может и клиент, и сервер.
2)      «X» - это своеобразный кусочек, который отправляется сервером и служит уникальным идентификатором для клиента. Как это определить? Очень просто – запустить процесс подключения и отключения настоящего клиента игры раз 100 и проследить за тем, что приходит в сообщении от сервера после заголовка «CACACACA» и сравнить с тем, что отравляется клиентом в сообщении, которым все завершается, то есть после «DF DF DF DF». Совпадает все 100 раз. Итак, это уникальный идентификатор клиента сетевой игры.

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

Но так и остался открытым вопрос, что все-таки нужно отправлять серверу, после получения Id?

5 комментариев: