Я несколько раз переписывал свои библиотеки, так как очень часто они меня не устраивали: много евентов, кривая структура, кривой код и прочее.
Чтобы учесть свои ошибки, я решил создать эту тему
Описывайте ваш код и пишите замечания.
На данный момент мое создание выглядит так:
Client - сокет, читает, отправляет пакеты
В нем находятся главные евенты:
PHP код:
public event PacketReceive;
public event ContainerReceive;
public event Connected;
public event Disconnected;
Они передают пакеты(или части контейнера) и статус подключения
CreatPacket - конвертирует байт в пакет и обратно
Data - там хранятся данные(UID, AccID) и структуры(struct, о них потом)
EncDec - через этот класс пропускаются все байт, в нем они шифруются, дешифруются и распаковываются.
MD5Hash - генерация хеша(0x03)/ключей(0x02)
Packet - класс для чтения и записи пакеты
PacketRead, PacketSend - база пакетов,
PacketRead читает пакет и возвращает структуру(из Data) этого пакета
RC4, Unpack - и так понятно
Пример кода на основе этой библиотеки(до входа в мир): Код
PHP код:
using System;
using System.Collections.Generic;
using System.Text;
using OOGLibrary;
using System.Timers;
namespace Example
{
class Program
{
static Data data;
static PacketSend send;
static PacketRead recv;
static Client client;
static string login = "freepvps";
static string pass = "";
static void Main(string[] args)
{
client = new Client("195.211.130.212", 29000);
client.Connected += new Client.DInfo(client_Connected);
client.Disconnected += new Client.DInfo(client_Disconnected);
client.PacketReceive += new Client.DPacketReceive(client_PacketReceive);
client.ContainerReceive += new Client.DPacketReceive(client_ContainerReceive);
client.Connect();
while (true) { Console.ReadKey(); }
}
static void client_Connected(object sender)
{
Console.WriteLine("Успешное подключение");
data = new Data();
send = new PacketSend(client, data);
recv = new PacketRead(client, data);
}
static void client_Disconnected(object sender)
{
Console.WriteLine("Ошибка подключения");
}
static void client_ContainerReceive(object sender, Packet P)
{
switch (P.GetType())
{
case 0xA4:
Console.WriteLine("Вы успешно вошли");
return;
}
}
static void client_PacketReceive(object sender, Packet P)
{
switch (P.GetType())
{
case 0x01:
byte[] key = recv.S0001_AuthData(P);
send.C0003_LoginRequest(login, pass, key);
return;
case 0x02:
byte[] enckey = recv.S0002_SMKey(P);
send.C0002_CMKey(true, enckey);
return;
case 0x05:
Console.WriteLine("Неверный логин или пароль");
return;
case 0x04:
recv.S0004_OnlineAnnounce(P);
send.C005A_KeepAlive();
send.C0052_RoleListResp();
return;
case 0x8F:
LastLogin last = recv.S008F_LastLogin(P);
Console.WriteLine("IP прошлого подключения: {0}", last.lastip);
Console.WriteLine("Время прошлого подключения: {0}", last.lastlogin);
Console.WriteLine("Ваш IP: {0}", last.ip);
return;
case 0x53:
Player[] players = recv.S0053_RoleListReq(P);
if (players == null) send.C0052_RoleListResp();
else
{
for (int i = 0; i < players.Length; i++)
Console.WriteLine("[{0}][{1}] {2}", i, players[i].Level.ToString("000"), players[i].Name);
Console.Write("Выберете персонажа: ");
int id = int.Parse(Console.ReadLine());
send.C0046_SelectRole(id);
}
return;
case 0x47:
send.C0048_EnterWorld();
Console.WriteLine("Вход");
return;
}
}
}
}
________________ Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - твинки любого игрока, их дата создания, последний онлайн, статус удаления и прочее
Skype - freepvps
ICQ - 412705115
[Ссылки могут видеть только зарегистрированные пользователи. ] - ставкобот [Ссылки могут видеть только зарегистрированные пользователи. ] - общение в КЧ через смартфон
А где у тебя диспетчер принятых пакетов ?
Неужто это нездоровых размеров switch, типа представленного в клиенте ?
И если так - для каждого нового проекта - его копипаста полностью или частями ??
P.S. Не наезд - просто интересно.
Последний раз редактировалось vogel; 26.04.2012 в 20:58.
А где у тебя диспетчер принятых пакетов ?
Неужто это нездоровых размеров switch, типа представленного в клиенте ?
И если так - для каждого нового проекта - его копипаста полностью или частями ??
P.S. Не наезд - просто интересно.
Да, частично копирую этот самый switch
При написании библиотеки я максимально постарался реализовать ее код так, чтобы потом просто описания пакетов и не подстраивать саму библиотеку под новый проект
________________ Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - твинки любого игрока, их дата создания, последний онлайн, статус удаления и прочее
Skype - freepvps
ICQ - 412705115
[Ссылки могут видеть только зарегистрированные пользователи. ] - ставкобот [Ссылки могут видеть только зарегистрированные пользователи. ] - общение в КЧ через смартфон
[Ссылки могут видеть только зарегистрированные пользователи. ]
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).