• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Indy

  • Автор темы konstin
  • Дата начала
K

konstin

Добрый вечер, тема не новая, но после прочтения кучи форумов в голове настоящая каша. Необходимо осуществить передачу файла от клиента к серверу, после чего сервер его просто сохраняет.
Пробывал по разному и остановился на:
клиент
1. передаем имя файла
2. передаем размер в байтах
3. читает файл в поток;
4. отсылаем поток на сервер

begin
if main.client.Socket.Connected = true then
begin
main.client.Socket.WriteLn('-send file'); // команда
main.client.Socket.WriteLn(ExtractFileName(sOpenDialog1.FileName)); // имя
main.client.Socket.WriteLn(inttostr(GetFileSize(sOpenDialog1.FileName)));
// размер
fs := TfileStream.Create(sOpenDialog1.FileName, fmOpenRead );
main.client.Socket.WriteBufferOpen;
main.client.Socket.write(fs);
main.client.Socket.WriteBufferFlush;
main.client.Socket.WriteBufferClose;
end;
fs.Free;
end;

сервер:
1. Ждем команды от постоянно подключенного клиента, если пришло '-send file' то начинаем принимать файл
2. читаем в рекорд имя
3. читаем в рекорд размер в байтах
4. созздаем файловый поток
5. читаем в этот поток данные

begin
com := AContext.Connection.Socket.ReadLn;
if AnsiContainsStr(com, '-send file') then
begin
main.log(com);
fi.name := AContext.Connection.Socket.ReadLn;
main.log(fi.name);
fi.size := AContext.Connection.Socket.ReadLn;
main.log(fi.size);
try
fs := TFileStream.Create(fi.name, fmCreate or fmShareDenyRead);
AContext.Connection.IOHandler.ReadStream(fs);
//
fs.f
finally
fs.Free;
end;
end;
end;

Файл вроде как и создается но... всегда фиксированного размера... видимо стандартный размер буфера - 1,25 гб. При этом если резко ракрыть клиент то файл принимает свой размер, но чаще всего поврежден. Если кидать допустим исошку в 4 гб то он естественно выводит что памяти нехватает... но как разбить поток на части или вобщем его передать придумать не могу. На клиенте пробывал копировать поток в поток и так его отправлять но сервер все равно видит его как единое целое
 
K

konstin

эм.. Использую эти компоненты =), вообще с дэльфи и паскалем знаком на уровне лаб... если не так понял вопрос прошу прощения)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!