Форум: "Начинающим";
Текущий архив: 2007.03.11;
Скачать: [xml.tar.bz2];
ВнизПередача EXE-файла с помощью TServerSocket и TClientSocket Найти похожие ветки
← →
Wiktor (2007-02-15 07:28) [0]Здравствуйте, у меня проблемка: возможно ли передать EXE-файл по сети через TServerSocket и TClientSocket без потери данных.
(если да, то какие процедуры нужно использовать)
Заранее благодарю.
← →
Separator © (2007-02-15 07:50) [1]А чем отличается .exe файл от .txt?
← →
Сергей М. © (2007-02-15 08:12) [2]
> какие процедуры нужно использовать
SerdStream, SendBuf, ReceiveBuf
← →
Wiktor (2007-02-15 18:19) [3]>>А чем отличается .exe файл от .txt?
EXE-файл отличается от txt тем что:
1) это исполняюший файл.
2) это программа и её содержимое - это машинный код.
Я пробовал на Delphi писать 16-ричный редактор и передавать файл в текстовом коде, но TClientSocket не смог его правильно скомпилировать в EXE.
Поэтому я обратился за помощью.
← →
Джо © (2007-02-15 21:45) [4]> [3] Wiktor (15.02.07 18:19)
> EXE-файл отличается от txt тем что:
Все перечисленное тобой совершенно несущественно. SerdStream, SendBuf и ReceiveBuf оперируют набором байтов, а байты текстового и исполнимого файла ни цветом, ни запахом не различаются :)
← →
Германн © (2007-02-16 01:56) [5]Имхо, мой телепатор сигнализирует мне, что автор хочет не просто передать exe-шник, а и выполнить его на удалённом компе! Очередной кулхацкер:)
← →
Elen © (2007-02-16 08:00) [6]
> Германн © (16.02.07 01:56) [5]
Не просто выполнить а еще перед этим цитирую :"правильно скомпилировать в EXE" через сокет. :), что мне не очень ясно...
← →
Сергей М. © (2007-02-16 09:22) [7]
> Wiktor (15.02.07 18:19) [3]
> TClientSocket не смог его правильно скомпилировать в EXE.
TClientSocket вообще ничего не "компилирует", у него совершенно иные задачи.
Где ты такой травы накурился - ума не приложу)
← →
medved_68 © (2007-02-16 09:50) [8]
> Я пробовал на Delphi писать 16-ричный редактор и передавать
> файл в текстовом коде, но TClientSocket не смог его правильно
> скомпилировать в EXE.
ОГО, ничего себе....Wiktor поделитесь, пожалуйста, секретом. Ну очень мне хочется иметь такой толковый TClientSocket.
← →
Wiktor (2007-02-16 14:48) [9]Начнём с начала:
<Джо>
Вот например "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. Надеюсь сомнения развеялись... :)
← →
Сергей М. © (2007-02-16 14:57) [10]
> P.S. Надеюсь сомнения развеялись
Наоборот добавились)
Ну с "компиляцией" ты, положим, облажался, а в чем собссно проблема-то ? До сих пор не понятно)
> TClientSocket записывает данные в файл
Ну не ври уже !)
Нет у этого компонента ни единого метода/св-ва, хоть каким-либо образом касающегося понятия "файл"
> я пробовал прередавать в текстовом формате)
Ну и накой ляд преобразовывать байт в два байта ?
← →
Elen © (2007-02-16 15:07) [11]
> Wiktor (16.02.07 14:48) [9]
Пусть сокет примет Стрим, который потом впихнеш в файл. Как делаеш? Может ошибка или недочет в проге?
← →
Wiktor (2007-02-16 15:48) [12]<Сергей М.>
А как это называется,
s:= Socket.ReceiveText;
"Socket.ReceiveText" - принятие данных...
← →
Wiktor (2007-02-16 15:57) [13]<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;
← →
Сергей М. © (2007-02-16 16:22) [14]
> Wiktor (16.02.07 15:48) [12]
??
Это так и называется.
К твоей-то так называемой "проблеме" это какое отношение имеет ? Да никакого.
Ну да, ну есть такой метод у этого класса - и что ? Он тебе, спрашивается, нахрен нужен ? Да нахрен он тебе не нужен ! Тебе нужны [2]
← →
Elen © (2007-02-16 16:32) [15]
> s:=memo1.Lines.Strings[pos];
Ты вообще со Стримом работать умееш? Стрим и ТString типа TMemo сильно отличаются. Забодь про Мемо если хочеш работать с Экзе.
← →
Elen © (2007-02-16 16:33) [16]
> "Socket.ReceiveText" - принятие данных...
Это принятие текстовой строки, а тебе нужно принять бинарный поток. см. [2]
← →
Сергей М. © (2007-02-16 16:40) [17]
> 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:54) [18]
> Сергей М. © (16.02.07 16:40) [17]
Ну покрайней мере я не стану принимать бинарные данные через это свойство, а через ReceiveBuf. Ато еще взбредет в голову как строку использовать :)
← →
Wiktor (2007-02-16 17:13) [19]<Сергей М.>
Извини...
TCustomWinSocket.ReceiveText: string;
Это ты использовал WinSocket или просто так процедуру назвал?
← →
medved_68 © (2007-02-16 17:51) [20]
> Это ты использовал WinSocket или просто так процедуру назвал?
Wiktor это вообще то код процедуры Socket.ReceiveText вернее его "пращура" TCustomWinSocket. :)))
← →
Wiktor (2007-02-16 19:21) [21]А, ну да, возможно, плосле 14 часов за Delphi голова соображает туго...
← →
Wiktor (2007-02-18 00:38) [22]А причём тут буфер (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
до скорых встреч...
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.03.11;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.044 c