HOME    FORUMS    MEMBERS    RECENT POSTS    LOG IN  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #11  
Старый 16.10.2009, 16:59
Hellsp@wn
Постоянный
Регистрация: 29.04.2007
Сообщений: 496
Провел на форуме:
2715445

Репутация: 588
По умолчанию

по-хорошему вот так делать не айс
Код:
        while true do
        begin
          rb := 0;
          // читаем 4 кила из файла
          ReadFile(hFile, buf, 4096, rb, nil);
          if rb = 0 then break; // если не считалось то выход из цикла
          send(sock, buf, rb, 0); // пошлем считанные данные
        end;
далеко не факт что удасться отправить за раз 4096
 
Ответить с цитированием

  #12  
Старый 16.10.2009, 17:00
mobilka
Познающий
Регистрация: 13.10.2009
Сообщений: 63
Провел на форуме:
373897

Репутация: 13
По умолчанию

господа помогите теперь сделать что бы не руками путь к загружаемому файлу писать а через опендиалог загружать и отправлять. сделал так-
Цитата:
procedure TForm1.Button2Click(Sender: TObject);
begin
if OpenDialog1.Execute then begin
Listbox1.Items.Add(ExtractFileName(opendialog1.Fil eName));
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Listbox1.Clear;
end;
button2 вызывает опендиалог. имя выбранного файла отображается в листбоксе. button3 очищает листбокс если был выбран не тот файл. а вот как сделать что бы s := SendFile('localhost', '/1.php', 'c:\test.txt'); тут менялось ума не приложу
 
Ответить с цитированием

  #13  
Старый 16.10.2009, 17:07
Nightmarе
Познавший АНТИЧАТ
Регистрация: 29.04.2007
Сообщений: 1,189
Провел на форуме:
5749763

Репутация: 1680


Отправить сообщение для Nightmarе с помощью ICQ
По умолчанию

Цитата:
Сообщение от Hellsp@wn  
по-хорошему вот так делать не айс
Код:
        while true do
        begin
          rb := 0;
          // читаем 4 кила из файла
          ReadFile(hFile, buf, 4096, rb, nil);
          if rb = 0 then break; // если не считалось то выход из цикла
          send(sock, buf, rb, 0); // пошлем считанные данные
        end;
далеко не факт что удасться отправить за раз 4096
что рекомендуешь?
 
Ответить с цитированием

  #14  
Старый 16.10.2009, 17:15
mobilka
Познающий
Регистрация: 13.10.2009
Сообщений: 63
Провел на форуме:
373897

Репутация: 13
По умолчанию

пришла идея-
s := SendFile('localhost', '/1.php', 'тут переменная какаято');
procedure TForm1.Button2Click(Sender: TObject);
begin
if OpenDialog1.Execute then begin
Listbox1.Items.Add(ExtractFileName(opendialog1.Fil eName));
тоже чтото надо дописать
end;
end;
господа не стесняемся предлагаем решение
может поможет кто?

Последний раз редактировалось mobilka; 16.10.2009 в 19:01..
 
Ответить с цитированием

  #15  
Старый 16.10.2009, 17:37
slesh
Познавший АНТИЧАТ
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

2 Hellsp@wn если бы да кабы. По хорошему нужно обрабатывать что разорвалась связь с серваком, а также что не удалось считать файл. итд итп. А друг юзверь вообще комп ребутнул. 4 кила полюбому уйдут в ядро, и send вернет это кол-во. другое дело, что не факт что они по сети передадутся.

хотя по хорошему достаточно просто подправить: Но всё равно это лишнее.
Код:
 
  wb := 0;
  error_flag := false;
  while wb < rb do
  begin
     len := send(sock, pointer(dword(@buf[0]) + wb)^, rb - wb, 0);    
     if len < 1 then
     begin
       error_flag := true;
       break;
     end;
     wb := wb + len;
   end;
 if error_flag then break;

Последний раз редактировалось slesh; 16.10.2009 в 17:40..
 
Ответить с цитированием

  #16  
Старый 16.10.2009, 17:38
ErrorNeo
Moderator - Level 7
Регистрация: 02.05.2009
Сообщений: 894
Провел на форуме:
4297091

Репутация: 2261


Отправить сообщение для ErrorNeo с помощью ICQ
По умолчанию

уважаемые.
этот код предполагает наличие у того, кто его пытается понять хотя бы основ знаний языка - на уровне "Delphi для самых начинающих".

Если вы вообще никогда не видели этого языка в глаза - не задавайте идиотских вопросов.
 
Ответить с цитированием

  #17  
Старый 16.10.2009, 17:41
Chrome~
Постоянный
Регистрация: 13.12.2008
Сообщений: 354
Провел на форуме:
1747641

Репутация: 175
Отправить сообщение для Chrome~ с помощью ICQ
По умолчанию

Вы задаете какие то нюбийские вопросы. Если вы изучали Delphi, то должны понимать, как вызвать эту функцию. К тому же автор все детально описал.
Цитата:
далеко не факт что удасться отправить за раз 4096
Почему не факт? Все будет нормально, если делать, скажем, так:
Код:
        while true do
        begin
          rb := 0;
          // читаем 4 кила из файла
          ReadFile(hFile, buf, 4096, rb, nil);
          if rb = 0 then break; // если не считалось то выход из цикла
          if send(sock, buf, rb, 0) <> rb then break; // пошлем считанные данные
        end;
Спасибо за код, slesh. (+ не могу поставить пока что)

Уже давно спросить хотел, так как сам занимаюсь этим... По моему самым правильным вариантом было бы начинать делать отправку файла вместе с заголовком, так как делают браузеры. К примеру: составил заголовок, который занимает 200 байт. Если мы решили отправлять по 4096 байт, то, соответственно, 4096-200=3896 байт считываем из файла, и заносим в массив. Это честно говоря не особо легко реализовать, особенно когда используем формат Content-Type: multipart/form-data, так как после отправки файла, мы должны отправить еще boundary.
 
Ответить с цитированием

  #18  
Старый 16.10.2009, 17:55
Nightmarе
Познавший АНТИЧАТ
Регистрация: 29.04.2007
Сообщений: 1,189
Провел на форуме:
5749763

Репутация: 1680


Отправить сообщение для Nightmarе с помощью ICQ
По умолчанию

Давайте уж тогда пофилософствуем как отправить на сервер файл больше чем позволяют настройки php “upload_max_filesize» и «post_max_size».

Мой вариант, отправлять файл по кускам, например по 1 метру на один POST запрос, а дальше php скрипт всё это добро склеит. Ну к каждому POST запросу допустим можно указать части, типа 1 из 20 и т.д…
Способ очень геморный и неудобный. Собственно, кто может что получше предложить?
 
Ответить с цитированием

  #19  
Старый 16.10.2009, 18:14
Chrome~
Постоянный
Регистрация: 13.12.2008
Сообщений: 354
Провел на форуме:
1747641

Репутация: 175
Отправить сообщение для Chrome~ с помощью ICQ
По умолчанию

Цитата:
Сообщение от Nightmarе  
Давайте уж тогда пофилософствуем как отправить на сервер файл больше чем позволяют настройки php “upload_max_filesize» и «post_max_size».
Никак, наверное. Хотя, может быть есть способ.
Цитата:
Сообщение от Nightmarе  
Мой вариант, отправлять файл по кускам, например по 1 метру на один POST запрос, а дальше php скрипт всё это добро склеит. Ну к каждому POST запросу допустим можно указать части, типа 1 из 20 и т.д…
Способ очень геморный и неудобный. Собственно, кто может что получше предложить?
Нет, это не очень удобно, лучше файл отправлять одним POST запросом (как и делал slesh).

Но если нужно учитывать значения upload_max_filesize и post_max_size, тогда можно было бы:
1) Получить от сервака сессию, которою потом передавать снова назад на сервер в виде либо кукиса, либо как параметр POST запроса.
2) Отправлять файл как ты уже говорил, кусками по 1 Мб., при этом указывать номер части и свою сессию. Сессия нужна для того, чтобы сервак знал, в какой файл будем записывать полученные данные. То есть, когда сервак только генерирует сессию, он должен создать уникальный префикс для файла, (скажем file_name_777_). Потом передаем клиенту сессию. Когда клиент уже будет отправлять нам данные на сервер, он должен будет указывать свою сессию, а сервак в свою очередь будет создавать файлы вида file_name_777_номер_части_файла с соответствующем содержанием.

Когда отослали все части, я бы сделал следующее: отослал бы дополнительный POST запрос на скрипт, в котором указывал бы сессию, и количество частей, которое я отправил. Сервер должен проверить, есть ли все части файла (то есть, существуют ли файлы file_name_777_1...file_name_777_N). Если существуют, - объединить всех в один файл, сами части удалить.

Но это мой вариант, хочу выслушать ваши, если есть ограничения в upload_max_filesize и post_max_size.
 
Ответить с цитированием

  #20  
Старый 16.10.2009, 18:52
Gar|k
Постоянный
Регистрация: 20.03.2009
Сообщений: 564
Провел на форуме:
991929

Репутация: 395


По умолчанию

Цитата:
Сообщение от Nightmarе  
Давайте уж тогда пофилософствуем как отправить на сервер файл больше чем позволяют настройки php “upload_max_filesize» и «post_max_size».
Если на сервере стоит наш скрипт... что нам стоит попдправиьт его вот так.

PHP код:
<?php
if(empty($_POST)){
   echo 
ini_get("upload_max_filesize")."\n".ini_get("post_max_size")."\n\0";
   }
...
и в программе сперва наперво отправлять GET запрос... так же на стороне сервера можно эти значения в байты перевести...

в своих клиентах я испольую вместо send и recv такие функции
Код:
// отослать ВСЕ ... - правильная функция
int sendall(SOCKET s, char *buf, int len, int flags)
{
    int total = 0;
    int n;

    while(total < len)
    {
        n = send(s, buf+total, len-total, flags);
        if(n == -1) { break; }
        total += n;
    }

    return (n==-1 ? -1 : total);
}

// принять ВСЕ ... - правильная функция
int recvall(SOCKET s, char *buf, int len, int flags)
{
    int total = 0;
    int n;

    while(total < len)
    {
        n = recv(s, buf+total, len-total, flags);
        if(n == -1) { break; }
        total += n;
    }

    return (n==-1 ? -1 : total);
}
ну и + к этому можно сокету задать время жизни... при обрыве связи на строне сервака через некоторое время он сам откинется.
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Books PSalm69 Избранное 273 13.02.2016 01:24
Литература Delphi Sams С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby 2 19.03.2010 19:46
Virus.Win32.Induc.a или "Снова записки новичка" _=(mac)=_ Защита ОС: вирусы, антивирусы, файрволы. 5 24.08.2009 23:34
Форма и javascript, отправка файла rcc0023 PHP 9 24.08.2009 16:19



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ