Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.06.29;
Скачать: [xml.tar.bz2];

Вниз

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

 
alex-drob   (2008-06-01 13:44) [0]

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


 
DrPass ©   (2008-06-01 13:47) [1]

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


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

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


 
DrPass ©   (2008-06-01 13:59) [3]

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


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


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


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


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

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

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

var b:pointer;

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

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


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


> 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:35) [7]

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.


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

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

$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);


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


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

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 15:02) [10]

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


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

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

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-03 01:45) [12]

type
TData = packed array[0..3] of byte;

buf, buf2: string;
login_len,pass_len,cl_len:tdata;

login,pass,cl:string;


 
Slym ©   (2008-06-03 05:24) [13]

tcpc.SendBuf(@buf2[0]^,length(buf2));?


 
alex-drob   (2008-06-03 11:20) [14]

ERROR: Pointer type required


 
alex-drob   (2008-06-03 11:38) [15]

ERROR: Pointer type required


 
Сергей М. ©   (2008-06-03 11:42) [16]


> alex-drob   (03.06.08 11:20) [14]


Кто такой tcpc и как объявлен buf2 ?


 
Умищ   (2008-06-03 11:42) [17]


> alex-drob   (03.06.08 11:38) [15]
> ERROR: Pointer type required


@Buf2[1]


 
alex-drob   (2008-06-03 11:49) [18]

tcpc: TTcpClient;
buf2: string


 
Сергей М. ©   (2008-06-03 11:51) [19]

tcpc.SendBuf(PChar(buf2)^, Length(buf2));


 
alex-drob   (2008-06-03 11:59) [20]


> Сергей М. ©   (03.06.08 11:51) [19]



> Умищ   (03.06.08 11:42) [17]


Спасибо! и так и так заработало!

У меня ещё вопрос, пробовал без buf и buf2 в tmemorystream не получилось,

ms:=tmemorystream.Create;
 ms.SetSize(sizeof(mph)+length(buf));
 ms.Seek(0,0);
 ms.Write(mph,sizeof(mph));
 ms.Write(login_len,4);
 ms.Write(login,length(login));
 ms.Write(pass_len,4);
 ms.Write(pass,length(pass));
 ms.Write(stat,4);
 ms.Write(cl_len,4);
 ms.Write(cl,length(cl));
 ms.Seek(0,0);


тоесть получилось на половину!

вот эти данные ms.Write(mph,sizeof(mph)); нормально выводяться

и цифровые, а там где строку запуздыриваю, там потом не те байты выводяться!


 
alex-drob   (2008-06-03 12:11) [21]

всё! разобрался!

ms.Write(PChar(login)^,length(login));

ms.Write(har(pass)^,length(pass));

ms.Write(har(cl)^,length(cl));


 
Сергей М. ©   (2008-06-03 12:20) [22]


> ms:=tmemorystream.Create;
>  ms.SetSize(sizeof(mph)+length(buf));
>  ms.Seek(0,0);
>  ms.Write(mph,sizeof(mph));
>  ms.Write(login_len,4);
>  ms.Write(login,length(login));
>  ms.Write(pass_len,4);
>  ms.Write(pass,length(pass));
>  ms.Write(stat,4);
>  ms.Write(cl_len,4);
>  ms.Write(cl,length(cl));
>  ms.Seek(0,0);


Куча лишних и/или бестолковых/вредных телодвижений.

ms:=tmemorystream.Create;
ms.WriteBuffer(mph, SizeOf(mph));
ms.WriteBuffer(login_len, SizeOf(login_len));
ms.WriteBuffer(PChar(login)^, Length(login));
ms.WriteBuffer(pass_len, SizeOf(pass_len));
ms.WriteBuffer(PChar(pass)^, Length(pass));
ms.WriteBuffer(stat, SizeOf(4));
ms.WriteBuffer(cl_len, SizeOf(lc_len));
ms.WriteBuffer(PChar(cl)^, Length(cl));
ms.SendStream(ms);


 
alex-drob   (2008-06-03 12:54) [23]

каких?

ms.Seek(0,0); - этих?


 
Сергей М. ©   (2008-06-03 12:58) [24]


> alex-drob   (03.06.08 12:54) [23]


Нет, именно для SendStream она, конечно, не лишняя, хотя проще и наглядней вместо нее использовать

ms.Position := 0;


 
ага0   (2008-06-03 13:06) [25]


>Куча лишних и/или бестолковых/вредных телодвижений.


Эт точна. WsaSend и все дела.


 
Сергей М. ©   (2008-06-03 14:02) [26]


> ага0   (03.06.08 13:06) [25]


> WsaSend и все дела


Череп не жмет ?)
В теме ни слова про Windows)


 
DiamondShark ©   (2008-06-03 14:19) [27]


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

Передать одну структуру, потом передать другую структуру.


 
alex-drob   (2008-06-03 14:35) [28]


> DiamondShark ©   (03.06.08 14:19) [27]

Спасибо! Так тоже работает!


 
DiamondShark ©   (2008-06-03 14:46) [29]


> alex-drob   (03.06.08 14:35) [28]

А, если не секрет, зачем это было нужно?
TCP -- это такая штука, которая передаваемые данные может склеивать и фрагментировать как угодно, вне зависимости от того, какими фрагментами они посылаются.
Соответственно, все прикладные протоколы поверх TCP должны быть рассчитаны на то, чтобы передающий и приёмный конец могли передавать данные любыми порциями, вплоть до экстремальных -- от слепленных в один большой кусок, до порезанных на отдельные байты.


 
alex-drob   (2008-06-03 15:01) [30]

пытаюсь клиента типа mailagent написать! но с сетью не когда не работал! просто два запроса послал, а на третий нужно было послать структуру и строку за ней!


 
ага0   (2008-06-03 15:21) [31]


> Сергей М. ©   (03.06.08 14:02) [26]


> Череп не жмет ?)

А ты пошто интересушься? Имешь с ентим проблемс?

> В теме ни слова про Windows)

В теме и за компоненты ни гу-гу. мне нужно их передать по tcp за один приём - баста.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.06.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.047 c
2-1212337033
Ceil
2008-06-01 20:17
2008.06.29
Подскажите


15-1210838747
Игорь М.
2008-05-15 12:05
2008.06.29
проблемы с видеотображением


15-1210903242
Slider007
2008-05-16 06:00
2008.06.29
С днем рождения ! 16 мая 2008 пятница


2-1212493010
Nicolas
2008-06-03 15:36
2008.06.29
Запрос на составную выбору без повторений


2-1212170295
Gjo
2008-05-30 21:58
2008.06.29
Закрытие консольных приложений





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский