Модераторы: Snowy, Poseidon, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Протокол Mail.Ru, Не понятно... 
:(
    Опции темы
Coderr
Дата 30.10.2007, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 27.1.2006
Где: Vesnet

Репутация: нет
Всего: 0



Здравствуйте! Решил написать Mail.Ru клиент. Вроде открытый протокол, но ничего не понятно!!! smile Описание слишком скудное и разработчики Мэйла на крик помощи не отвечают...
Единственное, что сделал - сформировал файл констант и типов методом перевода сишного заголовочника в делфовый юнит. =) Его можно взять в аттаче.
А просьба, собсно, такая. Объясните как формировать пакеты.  smile 

Присоединённый файл ( Кол-во скачиваний: 31 )
Присоединённый файл  Mail_Constans.pas 4,31 Kb
--------------------
Кодинг - это стиль жизни!   
PM WWW ICQ   Вверх
MetalFan
Дата 31.10.2007, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



дал бы хоть ссылку на спецификацию...


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Coderr
  Дата 31.10.2007, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 27.1.2006
Где: Vesnet

Репутация: нет
Всего: 0



Хм... Неужели её ещё мало кто видел?  smile 
Описание протокола Mail.Ru
--------------------
Кодинг - это стиль жизни!   
PM WWW ICQ   Вверх
VICTAR
Дата 1.11.2007, 04:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 3
Всего: 80



Усе элементарно =). Пакет=Header(44 байта) + Data(Header.dlen).
Ну а дальше флаг в руки... =)
PM MAIL   Вверх
aktuba
Дата 1.11.2007, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 9
Всего: 38



Цитата

Хм... Неужели её ещё мало кто видел?


Например, я не видел и не планирую в ближайшее время. Пока что использую только icq, если надо будет менять - перейду на gtalk или jabber... Но никак не на mail-агент...


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Coderr
  Дата 3.11.2007, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 27.1.2006
Где: Vesnet

Репутация: нет
Всего: 0



VICTAR, это, конечно, всё понятно. И с математикой у меня хорошо. А КАК??? Как отправлять/принимать? Решил для пробы использовать два ClientSocketа. Одним получать сервер к которому коннектиться, другой - для всего остального.
С получением доступного сервера и отправкой HELLO пакета  всё нормально, а вот принять MRIM_CS_HELLO_ACK не могу. Принять-то принимаю, но в нём данных нет... =( Делаю всё так:
Код

TPacketHeader = packed record
   magic     : longword;              // Magic
   proto     : longword;              // Версия протокола
   seq       : longword;              // Номер последовательности
   msg       : longword;              // Тип пакета
   dlen      : longword;              // Длина данных
   from      : longword;              // Адрес отправителя
   fromport  : longword;              // Порт отправителя
   reserved  : array[0..15] of byte;            // Зарезервированно
  end;

  PPacketHeader = ^TPacketHeader;

...

procedure CreatePacket(Packet: PPacketHeader; Sequence, Command, Port: Longword; IP: string);
begin
 ZeroMemory(Packet, sizeof(TPacketHeader));
 with Packet^ do begin
  magic    := CS_MAGIC;
  proto    := PROTO_VERSION;
  seq      := Sequence;
  msg      := Command;
  from     := inet_addr(PChar(IP));
  fromport := Port;
 end;
end;

procedure TForm1.Packet_MRIM_CS_HELLO;
var
  Packet: TPacketHeader;
begin
 CreatePacket(@Packet, Sequence, MRIM_CS_HELLO, ClientSocket.Port, ClientSocket.Host);
 ClientSocket.Socket.SendBuf(Packet, sizeof(TPacketHeader));
end;

procedure TForm1.ClientSocketRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
 Header: PPacketHeader;
begin
 Header := @Socket.Data;

 Memo.Lines.Add(IntToStr(Header.seq)+';'+IntToStr(Header.msg)+';'+IntToStr(Header.dlen));
 // Вывод я сделал примерно. Может я вывожу просто неправильно?
end;

procedure TForm1.FirstClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  ip_port: string;
begin
 ip_port := Socket.ReceiveText;
 FirstClientConnect.Active := False;
 // Получаем IP и порт сервера
 ClientSocket.Address := copy(ip_port,1,pos(':',ip_port)-1);
 ClientSocket.Port := StrToInt(copy(ip_port,pos(':',ip_port)+1,length(ip_port)-pos(':',ip_port)-1));
 ClientSocket.Active := True;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 FirstClientConnect.Active := True;                   // Активизируем клиент для получение доступного сервера
end;

procedure TForm1.ClientSocketConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
 Packet_MRIM_CS_HELLO;
end;


Присоединённый файл ( Кол-во скачиваний: 37 )
Присоединённый файл  Mail_client.rar 17,76 Kb
--------------------
Кодинг - это стиль жизни!   
PM WWW ICQ   Вверх
Coderr
  Дата 3.11.2007, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 27.1.2006
Где: Vesnet

Репутация: нет
Всего: 0



VICTAR, это, конечно, всё понятно. И с математикой у меня хорошо. А КАК??? Как отправлять/принимать? Решил для пробы использовать два ClientSocketа. Одним получать сервер к которому коннектиться, другой - для всего остального.
С получением доступного сервера и отправкой HELLO пакета  всё нормально, а вот принять MRIM_CS_HELLO_ACK не могу. Принять-то принимаю, но в нём данных нет... =( Делаю всё так:
Код

TPacketHeader = packed record
   magic     : longword;              // Magic
   proto     : longword;              // Версия протокола
   seq       : longword;              // Номер последовательности
   msg       : longword;              // Тип пакета
   dlen      : longword;              // Длина данных
   from      : longword;              // Адрес отправителя
   fromport  : longword;              // Порт отправителя
   reserved  : array[0..15] of byte;            // Зарезервированно
  end;

  PPacketHeader = ^TPacketHeader;

...

procedure CreatePacket(Packet: PPacketHeader; Sequence, Command, Port: Longword; IP: string);
begin
 ZeroMemory(Packet, sizeof(TPacketHeader));
 with Packet^ do begin
  magic    := CS_MAGIC;
  proto    := PROTO_VERSION;
  seq      := Sequence;
  msg      := Command;
  from     := inet_addr(PChar(IP));
  fromport := Port;
 end;
end;

procedure TForm1.Packet_MRIM_CS_HELLO;
var
  Packet: TPacketHeader;
begin
 CreatePacket(@Packet, Sequence, MRIM_CS_HELLO, ClientSocket.Port, ClientSocket.Host);
 ClientSocket.Socket.SendBuf(Packet, sizeof(TPacketHeader));
end;

procedure TForm1.ClientSocketRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
 Header: PPacketHeader;
begin
 Header := @Socket.Data;

 Memo.Lines.Add(IntToStr(Header.seq)+';'+IntToStr(Header.msg)+';'+IntToStr(Header.dlen));
 // Вывод я сделал примерно. Может я вывожу просто неправильно?
end;

procedure TForm1.FirstClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  ip_port: string;
begin
 ip_port := Socket.ReceiveText;
 FirstClientConnect.Active := False;
 // Получаем IP и порт сервера
 ClientSocket.Address := copy(ip_port,1,pos(':',ip_port)-1);
 ClientSocket.Port := StrToInt(copy(ip_port,pos(':',ip_port)+1,length(ip_port)-pos(':',ip_port)-1));
 ClientSocket.Active := True;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 FirstClientConnect.Active := True;                   // Активизируем клиент для получение доступного сервера
end;

procedure TForm1.ClientSocketConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
 Packet_MRIM_CS_HELLO;
end;


Присоединённый файл ( Кол-во скачиваний: 15 )
Присоединённый файл  Mail_client.rar 17,76 Kb
--------------------
Кодинг - это стиль жизни!   
PM WWW ICQ   Вверх
VICTAR
Дата 4.11.2007, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 3
Всего: 80



Примерно так
Код

procedure TForm1.ClientSocketRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  Header: PPacketHeader;
  aSize: integer;
begin
  aSize := Socket.ReceiveLength;
  if aSize > 0 then
  begin
    New(Header);
    Socket.ReceiveBuf(Header^, aSize);
    Memo.Lines.Add(IntToStr(Header^.seq) + ';' + IntToStr(Header^.msg) + ';' +
      IntToStr(Header^.dlen));
    Dispose(Header);
  end;
end;


Но учти, что это не универсальный способ. За один прием у тебя может придти несколько пакетов, или вообще половина. Так что надо позаботиться о разбитии пакетов. 
PS не забывай про Data. Сейчас ты принимаешь только Header
PM MAIL   Вверх
Coderr
Дата 4.11.2007, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 27.1.2006
Где: Vesnet

Репутация: нет
Всего: 0



Спасиб. Сейчас затестю. Про Data помню, просто на сейчас я, как видишь, застопорился на HELLO пакете  smile

Добавлено через 6 минут и 12 секунд
Спасибо! Код работоспособный! =) Пойду разбираться с Authorise и пынг пакетами. =)))  smile 
--------------------
Кодинг - это стиль жизни!   
PM WWW ICQ   Вверх
W4FhLF
Дата 4.11.2007, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: нет
Всего: 121



Поснифай официального клиента, очень поможет. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Coderr
Дата 6.11.2007, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 27.1.2006
Где: Vesnet

Репутация: нет
Всего: 0



Хочу, чтобы data типа Pointer указывал на первый элемент пришедших данных. Сделал так:
Код

procedure TForm1.ClientSocketRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
 Header: PPacketHeader;
 Data: Pointer;
 Size: integer;
begin
 Size := Socket.ReceiveLength;
 if Size > 0 then begin
  Socket.ReceiveBuf(Data, Size);
  New(Header);
  Header := PPacketHeader(Data);
 end;
end;

Не работает.  smile
Трассировка показала, что в Data попадает первые 4 байта, т.е. Magic.
Подскажите, как получить в Data указатель на первый элемент, чтобы потом просто сдвигать указатель и читать то, что мне нужно?

И ещё... Создал функцию для обработки UL блоков.
Код

function TForm1.GetPacketUL(Length: LongWord; Data: Pointer): LongWord;
begin
 Result := 0;
 Result := PCardinal(Data)^;
 Data := PCardinal(Data + SizeOf(LongWord)); // Сдвигаем указатель
end;
end;
 
Только на строке сдвига указателя при компиляции вылезает ошибка. =( Как сдвинуть указатель правильно?

Это сообщение отредактировал(а) Coderr - 7.11.2007, 08:42
--------------------
Кодинг - это стиль жизни!   
PM WWW ICQ   Вверх
Coderr
Дата 7.11.2007, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 27.1.2006
Где: Vesnet

Репутация: нет
Всего: 0



В раздел "сети" вообще хоть кто-нибудь заглядывает?  smile 
--------------------
Кодинг - это стиль жизни!   
PM WWW ICQ   Вверх
ne0n
Дата 8.11.2007, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


PlayBoy
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 5.8.2005
Где: Н.Новгород

Репутация: нет
Всего: 11



может быть это поможет smile ?


Присоединённый файл ( Кол-во скачиваний: 106 )
Присоединённый файл  Magent.rar 13,25 Kb
PM MAIL ICQ   Вверх
Coderr
Дата 8.11.2007, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 27.1.2006
Где: Vesnet

Репутация: нет
Всего: 0



ne0n, сам писал? Если сам, то респект, но не  то что мне надо. =)
--------------------
Кодинг - это стиль жизни!   
PM WWW ICQ   Вверх
ne0n
Дата 9.11.2007, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


PlayBoy
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 5.8.2005
Где: Н.Новгород

Репутация: нет
Всего: 11



Coderr, не, не сам, не помню откуда взял его, но точно помню что он за 10 баксов продаеться в электонных магазинах  smile 
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.1190 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.