ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
 |
переменную Jpeg из памяти в Socket |

10.05.2009, 03:46
|
|
Участник форума
Регистрация: 10.01.2007
Сообщений: 140
Провел на форуме: 246020
Репутация:
105
|
|
переменную Jpeg из памяти в Socket
Нужна помощь в отправке переменной типа TJpegImage в сокет "на лету" из памяти. вариант сохранить в файл а затем отправлять не предлагать
перевожу сначала Jpeg в MemoryStream а затем стрим копирую в буфер, но уже при самом переводе из jpeg в memorystream облом какойто, размер картинки в два раза растет, а при передаче в буфер совсем ноль, может существует способ непосредственно используя переменную jpeg отправлять в сокет?
PHP код:
procedure SendJpeg(JpegName:String);
const
PACKET_DATA_SIZE = 16777216;//16*1024*1024//16ÌÁ
type
PByteArray = ^TByteArray;
TByteArray = array[0..PACKET_DATA_SIZE-1] of byte;
var
Buf : PByteArray;
jpg : TJpegImage;
MemStream : TMemoryStream;
flw : File;
begin
jpg := TJpegImage.Create;
MemStream := TMemoryStream.Create;
try
jpg.LoadFromFile(JpegName);
try
jpg.SaveToStream(MemStream);
GetMem(Buf,MemStream.Size);
MemStream.WriteBuffer(Buf^,MemStream.Size);
SendBuf(Sock,Buf^,MemStream.Size);
jpg.SaveToFile('1.jpg');//сохраняется файл размером 3 кб
MemStream.SaveToFile('C:\2.jpg');//сохраняется файл размером 6 кб
AssignFile(flw,'C:\3.jpg');
ReWrite(flw,1);
BlockWrite(flw,buf^,MemStream.Size);//ничего не сохраняется
CloseFile(flw);
FreeMem(Buf);
finally
end;
finally
jpg.free;
MemStream.Free;
end;
end;
|
|
|

10.05.2009, 10:32
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
MemStream.WriteBuffer(Buf^,MemStream.Size); - это ты запишешь буфер в поток, а тебе нужно читать его типа ReadBuffer. Воть только не забывай устанавливать позицию на начала потока MemStream.position:=0; типа так
|
|
|

10.05.2009, 15:58
|
|
Участник форума
Регистрация: 10.01.2007
Сообщений: 140
Провел на форуме: 246020
Репутация:
105
|
|
Все равно ничего не вышло
Видимо всте таки придется записать в файл а затем отправить в сокет 
|
|
|

10.05.2009, 17:03
|
|
Участник форума
Регистрация: 25.05.2007
Сообщений: 290
Провел на форуме: 1740746
Репутация:
435
|
|
Способ 1.
Можно воспользоваться компонентами TNMStrmServ и TNMStrm. Они специально предназначены для обмена потоками данных.
PHP код:
//Обработчик для клиента:
var
MyStream: TMemoryStream;
Jpg: TJpegImage;
begin
...
//тут сами определите как у вас появляется Jpg
...
MyStream := TMemoryStream.Create;
Jpg.SaveToStream(MyStream);
NMStrm1.PostIt(MyStream);
MyStream.Free;
end;
//Обработчик для сервера:
procedure TForm1.NMStrmServ1MSG(Sender: TComponent;
const sFrom: string; strm: TStream);
var
MyStream: TMemoryStream;
begin
MyStream := TMemoryStream.Create;
MyStream.CopyFrom(strm, NMStrmServ1.BytesTotal);
MyStream.SaveToFile('c:\windows\1.jpg');
end;
2 Способ.
рекомендую.
PHP код:
private
{ Private declarations }
Reciving: boolean;
DataSize: integer;
Data: TMemoryStream;
...
...
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
// Посылаем команду для начала передачи файла.
Socket.SendText('send');
end;
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
s, sl: string;
Jpg: TJpegImage;
begin
...
// и тут сами определите откуда у вас Jpg
...
s:= Socket.ReceiveText;
// Если мы не в режиме приёма:
if not Reciving then
begin
// Теперь нам необходимо получить длину потока данных.
SetLength(sl, StrLen(PChar(s))+1); // +1 for the null terminator
StrLCopy(@sl[1], PChar(s), Length(sl)-1);
DataSize:= StrToInt(sl);
Data:= TMemoryStream.Create;
// Удаляем информацию о размере из данных.
Delete(s, 1, Length(sl));
Reciving:= true;
end;
// Сохраняем данные в файл, до тех пор, пока не получим все данные.
try
Data.write(s[1], length(s));
if Data.Size = DataSize then
begin
Data.Position:= 0;
Jpg.LoadFromStream(Data);
Data.Free;
Reciving:= false;
Socket.Close;
end;
except
Data.Free;
end;
end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
ms: TMemoryStream;
Jpg: TJpegImage;
begin
...
// и даже тут сами определите откуда у вас Jpg
...
// Клиент получает команду на передачу файла.
if Socket.ReceiveText = 'send' then
begin
ms:= TMemoryStream.Create;
try
// Получаем данные на передачу.
Jpg.SaveToStream(ms);
ms.Position:= 0;
// Добавляем длину данных, чтобы клиент знал,
// сколько данных будет передано
// Добавляем #0 , чтобы можно было определить,
// где заканчивается информация о размере.
Socket.SendText(IntToStr(ms.Size) + #0);
// Посылаем его.
Socket.SendStream(ms);
except
// Итак, осталось освободить поток, если что-то не так.
ms.Free;
end;
end;
end;
end.
удачи в написании))) не забывайте передавать зашифрованные данные.
|
|
|

10.05.2009, 18:35
|
|
Участник форума
Регистрация: 10.01.2007
Сообщений: 140
Провел на форуме: 246020
Репутация:
105
|
|
пишу без сервер/клиент сокета, использую ВинСок, поэтому не подходит вариант.
Буду искать аналог юнита джипег или потрошить три-четыре модуля придется.
|
|
|

19.05.2009, 13:00
|
|
Новичок
Регистрация: 13.06.2008
Сообщений: 24
Провел на форуме: 28814
Репутация:
4
|
|
http://hellknights.void.ru/articles/0x48k-VisualSpy.htm
Медитируй и просветлишся.
З.Ы.Да, там правда автор синячит, но настоящему дельфину это перелопатить не составит труда, там голое АПИ
Последний раз редактировалось Ryu; 19.05.2009 в 13:03..
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|