Форум: "Начинающим";
Текущий архив: 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.043 c