![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача EXE-файла с помощью TServerSocket и TClientSocket [D7, WinXP]
Wiktor © (2007-02-15 07:28:00)Здравствуйте, у меня проблемка: возможно ли передать EXE-файл по сети через TServerSocket и TClientSocket без потери данных.
(если да, то какие процедуры нужно использовать)
Заранее благодарю.
Wiktor (2007-02-18 00:38:00) [1]А причём тут буфер (ReceiveBuf), ведь пользователи не смогут прочитать данные из моего буфера...А если б и смогли, то это скорее всего считалось бы нарушением политики безопасности.
"SerdStream" - ...
Например:
<Отправка>
var
ms: TMemoryStream;
begin
...
ms:= TMemoryStream.Create;
ms.LoadFromFile ('C:\12.exe');
ms.Position:= 0;
Socket.SendText(IntToStr(ms.Size) + #0);
Socket.SendStream(ms);
ms.Free;
...
<Приём>
var
s, sl: string;
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));
try
Data.Write(s[1], length(s));
if Data.Size = DataSize then
begin
Data.Position:= 0;
data.SaveToFile('C:\123.exe'); //Именно про эту строку я и забыл
Data.Free;
Socket.Close;
end;
except
Data.Free;
end;
Казалось и делов то, но без вас я бы не справился,
огромное СПАСИБО:
Separator
Сергей М.
Джо
Германн
Elen
medved_68
до скорых встреч...
Wiktor (2007-02-16 19:21:00) [2]А, ну да, возможно, плосле 14 часов за Delphi голова соображает туго...
medved_68 (2007-02-16 17:51:00) [3]
> Это ты использовал WinSocket или просто так процедуру назвал?
Wiktor это вообще то код процедуры Socket.ReceiveText вернее его "пращура" TCustomWinSocket. :)))
Wiktor (2007-02-16 17:13:00) [4]<Сергей М.>
Извини...
TCustomWinSocket.ReceiveText: string;
Это ты использовал WinSocket или просто так процедуру назвал?
Elen (2007-02-16 16:54:00) [5]
> Сергей М. © (16.02.07 16:40) [17]
Ну покрайней мере я не стану принимать бинарные данные через это свойство, а через ReceiveBuf. Ато еще взбредет в голову как строку использовать :)
Сергей М. (2007-02-16 16:40:00) [6]
> Elen © (16.02.07 16:33) [16]
> Это принятие текстовой строки
Да ну вас, барышня).. Ну что вы, ей-ей, трындите ?)
Генофонд-то всегда перед носом:
function TCustomWinSocket.ReceiveText: string;
begin
SetLength(Result, ReceiveBuf(Pointer(nil)^, -1));
SetLength(Result, ReceiveBuf(Pointer(Result)^, Length(Result)));
end;
Вот скоко есть в принимающем буфере (текст там или порнуха - неважно), столько и будет засандалено - безо всякого разбора ! - в строковый буфер...
И оно очевидно)
Elen (2007-02-16 16:33:00) [7]
> "Socket.ReceiveText" - принятие данных...
Это принятие текстовой строки, а тебе нужно принять бинарный поток. см. [2]
Elen (2007-02-16 16:32:00) [8]
> s:=memo1.Lines.Strings[pos];
Ты вообще со Стримом работать умееш? Стрим и ТString типа TMemo сильно отличаются. Забодь про Мемо если хочеш работать с Экзе.
Сергей М. (2007-02-16 16:22:00) [9]
> Wiktor (16.02.07 15:48) [12]
??
Это так и называется.
К твоей-то так называемой "проблеме" это какое отношение имеет ? Да никакого.
Ну да, ну есть такой метод у этого класса - и что ? Он тебе, спрашивается, нахрен нужен ? Да нахрен он тебе не нужен ! Тебе нужны [2]
Wiktor (2007-02-16 15:57:00) [10]<Elen>
TRY
while pos <> DataSize do
begin
pos:=pos+1;
s:=memo1.Lines.Strings[pos];
f.Seek(pos,soBeginning);
f.Write(s,sizeof(s));
end;
EXCEPT
showmessage('Ошибка'); //К примеру
label2.Caption:='Передача прервана';
exit;
END;
Data.Free;
Wiktor (2007-02-16 15:48:00) [11]<Сергей М.>
А как это называется,
s:= Socket.ReceiveText;
"Socket.ReceiveText" - принятие данных...
Elen (2007-02-16 15:07:00) [12]
> Wiktor (16.02.07 14:48) [9]
Пусть сокет примет Стрим, который потом впихнеш в файл. Как делаеш? Может ошибка или недочет в проге?
Сергей М. (2007-02-16 14:57:00) [13]
> P.S. Надеюсь сомнения развеялись
Наоборот добавились)
Ну с "компиляцией" ты, положим, облажался, а в чем собссно проблема-то ? До сих пор не понятно)
> TClientSocket записывает данные в файл
Ну не ври уже !)
Нету этого компонента ни единого метода/св-ва, хоть каким-либо образом касающегося понятия "файл"
> я пробовал прередавать в текстовом формате)
Ну и накой ляд преобразовывать байт в два байта ?
Wiktor (2007-02-16 14:48:00) [14]Начнём с начала:
<Джо>
Вот например "SerdStream" - считывает только текст (у меня почему-то три первые буквы из EXE-файла "MZP", а далее просто не читает.
<Германн>
Не знаю, что там или кто там, сигнальзирует тебе, но я личноне собираюсь никому ничего отправлять, пользователи сами берут и качают и задают вопросы - "А чё проги-то нельзя скачивать,- только картинки...", да и я вовсе не какой нибуь.., как ты там сказал.., "Очередной кулхацкер". Если б мне нужен бал вирус, я бы не обратился к этому сайту.
P.S. Без обид. Ок.
<Elen>
Цитирую:
"Не просто выполнить а еще перед этим цитирую :"правильно скомпилировать в EXE" через сокет. :), что мне не очень ясно..."
Правильно скомпилировать в EXE через сокет, я имел в виду когда сокет принимает данные(когда я пробовал прередавать в текстовом формате), он записал их в виде:
4D5A90000300000004000000FFFF0000B80000000000000040000000000000000000000000000000 0000000000000000000000000000000000000000800000000E1FB
... и так далее и это была всего лишь текстовая информация.
<Сергей М.>
Вот с тобой я ещё могу согласиться, просто я не так выразился.
Немного выше я пояснял про это.
<medved_68>
Повторюсь, я не правильно выразился.
Но всё же TClientSocket записывает данные в файл...Конечно это нельзя назвать компиляцией.
Что насчёт HEX-редактора - это просто:
var
f:tfilestream;
s:byte;
begin
f:=tfilestream.Create('C:\1.txt',fmopenread); //открыть для чтения
f.Seek($003f,soBeginning); //читать от начала файла с указанного адреса
f.Read(s,sizeof(s)); //в переменную "s" записывается код значения
f.Free;
Это только описание...если надо доведёшь до ума.
P.S. Надеюсь сомнения развеялись... :)
medved_68 (2007-02-16 09:50:00) [15]
> Я пробовал на Delphi писать 16-ричный редактор и передавать
> файл в текстовом коде, но TClientSocket не смог его правильно
> скомпилировать в EXE.
ОГО, ничего себе.... Wiktorподелитесь, пожалуйста, секретом. Ну очень мне хочется иметь такой толковый TClientSocket.
Сергей М. (2007-02-16 09:22:00) [16]
> Wiktor (15.02.07 18:19) [3]
> TClientSocket не смог его правильно скомпилировать в EXE.
TClientSocket вообще ничего не "компилирует", у него совершенно иные задачи.
Где ты такой травы накурился - ума не приложу)
Elen (2007-02-16 08:00:00) [17]
> Германн © (16.02.07 01:56) [5]
Не просто выполнить а еще перед этим цитирую :"правильно скомпилировать в EXE" через сокет. :), что мне не очень ясно...
Германн (2007-02-16 01:56:00) [18]Имхо, мой телепатор сигнализирует мне, что автор хочет не просто передать exe-шник, а и выполнить его на удалённом компе! Очередной кулхацкер:)
Джо (2007-02-15 21:45:00) [19]> [3] Wiktor (15.02.07 18:19)
> EXE-файл отличается от txt тем что:
Все перечисленное тобой совершенно несущественно. SerdStream, SendBuf и ReceiveBuf оперируют набором байтов, а байты текстового и исполнимого файла ни цветом, ни запахом не различаются :)
Wiktor (2007-02-15 18:19:00) [20]>>А чем отличается .exe файл от .txt?
EXE-файл отличается от txt тем что:
1) это исполняюший файл.
2) это программа и её содержимое - это машинный код.
Я пробовал на Delphi писать 16-ричный редактор и передавать файл в текстовом коде, но TClientSocket не смог его правильно скомпилировать в EXE.
Поэтому я обратился за помощью.