Доброго времени суток, уважаемые формчане.
Есть у меня задачка логинится к серверу.
Сервер не мой и логинирование на нём происходит следующим образом:
Мы коннектимся, сервер присылает нам пакет, мы его читаем, формируем свой, в который запихиваем данные (логин - пароль) и отправляем обратно, ждём ответ. Получает пакет с кодом: успех, провал.
Есть исходник того, как это реализуется на C#, а вот как подобное реализовать на delphi у меня, честно говоря, не хватило соображаловки, буду благодарен за совет.
Описание класса на C#
Код:
using System.Collections.Generic;
using System.Net.Sockets;
using System.Security.Cryptography;
using System.Text;
namespace PWCheckAccount
{
class PWAuth
{
string IP;
int Port;
public bool Result { get; private set; }// Результат авторизации(связка(логин+пароль) верна/не верна)
public bool Connected { get; private set; }// Результат подключения к серверу(подключиться удалось/не удалось)
public PWAuth(string ip) : this(ip, 29000) { }
public PWAuth(string ip, int port)
{
IP = ip;
Port = port;
}
public bool Check(string login, string pass)
{
Result = false;
Connected = false;
TcpClient tcp = new TcpClient();
try
{
tcp.Connect(IP, Port);
}
catch { return false; }
Socket skt = tcp.Client;
Connected = skt.Connected;
while (skt.Connected)
{
byte[] buf = new byte[0xFF];
skt.Receive(buf);
if (buf[0] == 0x01)
{
List<byte> Send = new List<byte>();
byte[] key = new byte[0x10];
for (int i = 0; i < 0x10; i++) key[i] = buf[i + 3];
byte[] loginbt = Encoding.GetEncoding(1251).GetBytes(login);
byte[] hash = GetHash(key, login, pass);
Send.Add((byte)loginbt.Length);
Send.AddRange(loginbt);
Send.Add((byte)hash.Length);
Send.AddRange(hash);
Send.Add(0x00);
Send.Insert(0,(byte)Send.Count);
Send.Insert(0, 0x03);
skt.Send(Send.ToArray());
continue;
}
Result = buf[0] == 0x02;
break;
}
skt.Close();
return Result;
}
private byte[] GetHash(byte[] key, string login, string pass)
{
byte[] logwithpass = Encoding.ASCII.GetBytes(login + pass);
MD5 md5 = MD5.Create();
return new HMACMD5(md5.ComputeHash(logwithpass)).ComputeHash( key);
}
}
}
проблему , собственно составила работа с такими
0x03 значениями, т.к. не имею ни малейшего понятия как с ними работать в делфе.
Пользуюсь XE2 clientsocket.
Заранее благодарю!