![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как обьеденить две области памяти
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 сам решит, ему виднее.