Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как обьеденить две области памяти


Страницы:   1 2

alex-drob ©   (2008-06-01 13:44:00) 

Задача следующая.
есть структура aи b
мне нужно их передать по tcp за один приём чтобы они шли подрят непрерывно. как это сделать?


alex-drob   (2008-06-03 01:41:00) [21]

объеденить получилось, но в программе вывожу сразу после объединения

EF  BE  AD  DE  0A  00  01  00  02  00  00  00  38  10  00  00  27  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  0C  00  00  00  61  6C  65  78  40  6D  61  69  6C  2E  72  75  05  00  00  00  31  32  33  34  35  01  00  00  00  06  00  00  00  6D  79  6D  61  67  6E

а в процедуре

tcpSend отправляеться

AC  4B  D6  00  8C  43  D6  00  84  4B  D6  00  98  4B  D6  00  0C  00  00  00  05  00  00  00  06  00  00  00  01  00  00  00  FF  FF  FF  FF  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00

вот код объеденения:

  setlength(buf,len);
 move(login_len[0],buf[1],4);
 move(login[1],buf[5],length(login));
 move(pass_len[0],buf[5+length(login)],4);
 move(pass[1],buf[9+length(login)],length(pass));
 move(stat,buf[9+length(login)+length(pass)],4);
 move(cl_len[0],buf[13+length(login)+length(pass)],4);
 move(cl[1],buf[17+length(login)+length(pass)],length(cl));
 
 setlength(buf2,sizeof(mph)+length(buf));

 move(mph,buf2[1],sizeof(mph));
 move(buf[1],buf2[45],length(buf));

   memo3.Lines.Add('------------');
   memo3.Lines.Add('');
   for i:=1 to length(buf2) do
   memo3.Text:=memo3.Text+inttohex(integer(buf2[i]),2)+'  ';// здесь выводиться в мемо всё правильно
   memo3.Lines.Add('------------');

 tcpc.SendBuf(buf2,length(buf2));


alex-drob   (2008-06-01 15:02:00) [22]

спасибо! сейчас попробую!


Ум_ще   (2008-06-01 15:00:00) [23]

1. Я бы для уверенности в отсутствии выравнивания полей по границам написал packed record.
2. Для формирования буфера для передачи можно использовать разные типы данных.
Я бы воспользовался PCHAR или String.

var
  buf: String;
  Len: Integer;
begin
  Len := SizeOf(mrim_packet_header_t)+<Длина login>+<Длина password>+<Длина status>+<Длина user_agent>;
 SetLength(buf,Len);
 Move(mph,Buf[1],Len);
 Move(login,Buf[SizeOf(SizeOf(mrim_packet_header_t))+1],SizeOf(login));
и т.д.


alex-drob   (2008-06-01 14:58:00) [24]

вот так это на пхп

$tmp = pack ("l", strlen ($login)).$login.pack("l", strlen ($pass)).$pass."\x22\x10\x00\x00".pack ("l", strlen ($client)).$client;

$packet = "\xEF\xBE\xAD\xDE".//CS_MAGIC
"\x0A\x00\x01\x00".//номер отправляемой команды
"\x03\x10\x00\x00". //тип пакета
"\x38\x10\x00\x00".//номер команды и/или ответа MRIM_CS_LOGIN2

pack ("l", strlen ($tmp)). // Длина данных
"\x00\x00\x00\x00". // Адрес отправителя
"\x00\x00\x00\x00". // Порт отправителя

"\x00\x00\x00\x00".//++++++++++++++++++++
"\x00\x00\x00\x00".//
"\x00\x00\x00\x00".//зарезервиравано
"\x00\x00\x00\x00".//+++++++++++++++++++++
$tmp; //собственно данные

fwrite ($fp, $packet);


но там всё просто поставил точку и сложил!


alex-drob   (2008-06-01 14:35:00) [25]

type
 mrim_packet_header_t = record
   magic: DWORD;
   proto: DWORD;
   seq: DWORD;
   msg: DWORD;
   dlen: DWORD;
   from: DWORD;
   fromport: DWORD;
   reserved: Array[0..16-1] of char;
 end {mrim_packet_header_t};

var: mph:mrim_packet_header_t;

вторая строка формируеться так

LPS ## login
LPS ## password
UL ## status
LPS ## user_agent ## текстовое описание клиента пользователя

MMP бинарный протокол. Все числовые данные передаются как четырехбайтные целые НЕ в сетевом формате, т. е. первым идет старший байт, последним младший. Четырехбайтовые беззнаковые целые обозначаются UL.
Текстовые данные передаются с префексированной длиной, т. е. сначала UL, а потом строка (в кодировке windows-1251) длины UL без завершающего нуля. Обозначение в дальнейшем - LPS.


Ум_ще   (2008-06-01 14:23:00) [26]


> alex-drob   (01.06.08 14:06) [5]
> есть структура mph размером 44 байта.есть строка tmp:="0000gdfg0g00dg0d"выделяю
> буферvar b:pointer;getmem(b,sizeof(mph)+length(tmp));move(mph,
> d,sizeof(mph));правельно я понял? если да то дальше как
> прилепить в конец tmp?

Пока не приведешь структуры, нельзя сказать, правильно или нет.


alex-drob   (2008-06-01 14:06:00) [27]

есть структура mph размером 44 байта.
есть строка tmp:="0000gdfg0g00dg0d"

выделяю буфер

var b:pointer;

getmem(b,sizeof(mph)+length(tmp));
move(mph,d,sizeof(mph));

правельно я понял? если да то дальше как прилепить в конец tmp?


Ум_ще   (2008-06-01 14:02:00) [28]


> alex-drob   (01.06.08 13:44) 
> Задача следующая.есть структура a и bмне нужно их передать
> по tcp за один приём чтобы они шли подрят непрерывно. как
> это сделать?


Может быть хотя бы пример своих структур приведёшь?


DrPass   (2008-06-01 13:59:00) [29]

Выделяешь буфер с помощью GetMem. Копируешь с помощью Move. Потом передаешь и освобождаешь буфер с помощью FreeMem


alex-drob   (2008-06-01 13:52:00) [30]

так вот я и непойму как их скопировать? memorystream или как? я просто не когда не работал с памятью


DrPass   (2008-06-01 13:47:00) [31]

Скопируй их в общий буфер, одну за другой. И передай этот буфер. Только как его передавать, непрерывно или прерывно - драйвер TCP сам решит, ему виднее.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо