• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

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

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

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