Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Delphi > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 04.10.2014, 20:00   #1
Biohazard
Пользователь
 
Регистрация: 23.02.2009
Сообщений: 78
Смущение WinApi скачать страницу сайта

Доброе время суток.
Если вкратце: как узнать размер страницы сайта используя только вин апи.

предыстория.. Сначала делал используя компонент TWebBrowser, но что логично, из - за графической части, которую никуда не выкинуть скорость выполнения задачи была очень маленькой 500-550 страниц в минуту,

решил использовать компонент ЕIdHTTP, и get() скорость упала в раз 10, подозреваю что из за того что он заного на каждой ссылке проходил утентификацию,

пытался выудить через него winapi но заблудился и окончательно запутался, прослеживая как бегает курсор отладчика..

пока получилась такая ересь:
Код:
function gotolink(s:string):boolean;
var
  ASocket:TSocket;
  LAddr: TSockAddrIn;   // 'http://ШАПКА.ru/ССЫЛКА'  ССЫЛКА - переменная часть
  i:integer;
  VPort:word;
  VIP:word;
  LHost:THostEnt;
begin
  ASocket:=idwinsock2.Socket(2,1,0);
  LAddr.sin_port:=htons(0);
  Bind(ASocket, @LAddr, SizeOf(LAddr));
  i:=SizeOf(LAddr);
  GetSockName(ASocket,PSockAddr(@LAddr),i);
  VPort:=Ntohs(TSockAddr(LAddr).sin_port);
  setsockopt(ASocket,6, 1, '', 4);                     
  LHost := GetHostByName('ШАПКА.ru')^; //в оригинале сайт естественно другой
  connect(ASocket,@LAddr, SizeOf(LAddr));
  i:=SizeOf(LAddr);
  getpeername(ASocket,@LAddr, i);
end;
буду жадным, если спрошу готовый пример winapi?) но подозреваю что такое добро вполне быть может)
Biohazard вне форума   Ответить с цитированием
Старый 04.10.2014, 20:14   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,840
По умолчанию

Могу порекомендовать такое:http://procoder.info/index.php/entry/html-naraspashku/
I'm learning to live...
Stilet вне форума   Ответить с цитированием
Старый 06.10.2014, 05:16   #3
Biohazard
Пользователь
 
Регистрация: 23.02.2009
Сообщений: 78
По умолчанию

в общем сейчас есть такой длинный извращенный, но рабочий код, в конце пока не дописанный (нет закрытия сокетов)

Код:
function gotolink(s:string):boolean;
var
  ASocket:TSocket;
  LAddr: TSockAddrIn;
  i:integer;
  VPort:word;
  VIP:word;
  LHost:THostEnt;
  FDSet:TFDSet;
  Buffer:array[0..4999]of char;
  Count:integer;
  i2:integer;
begin
  ASocket:=Socket(AF_INET, SOCK_STREAM, 0);//V
  if(ASocket>0)then
  begin
    LAddr.sin_family := af_inet;
    LAddr.sin_addr.s_addr := INADDR_ANY;
    LAddr.sin_port:=htons(0);//V
    if(Bind(ASocket, @LAddr, SizeOf(LAddr))=0)then//V
    begin
      i:=SizeOf(LAddr);
      if(GetSockName(ASocket,PSockAddr(@LAddr),i)=0)then
      begin
        VPort:=Ntohs(TSockAddr(LAddr).sin_port);
        if(VPort>0)then
        begin
          if(setsockopt(ASocket,IPPROTO_TCP, TCP_NODELAY, '', 4)=0)then
          begin
            LHost := GetHostByName('Сайт')^;
            if(@LHost<>nil)then
            begin
              LAddr.sin_addr.S_un_b.s_b1 := Ord(Lhost.h_address_list^[0]);
              LAddr.sin_addr.S_un_b.s_b2 := Ord(Lhost.h_address_list^[1]);
              LAddr.sin_addr.S_un_b.s_b3 := Ord(Lhost.h_address_list^[2]);
              LAddr.sin_addr.S_un_b.s_b4 := Ord(Lhost.h_address_list^[3]);
              LAddr.sin_port := HToNS(80);
              if(connect(ASocket,@LAddr, SizeOf(LAddr))=0)then
              begin
                i:=SizeOf(LAddr);
                if(GetSockName(ASocket,PSockAddr(@LAddr),i)=0)then
                begin
                  VPort:=Ntohs(TSockAddr(LAddr).sin_port);
                  if(Vport>0)then
                  begin
                    i:=SizeOf(LAddr);
                    if(getpeername(ASocket,@LAddr, i)=0)then
                    begin
                      VPort:=Ntohs(TSockAddr(LAddr).sin_port);
                      if(VPort>0)then
                      begin
                        for i:=1 to 8 do
                          sendbuff[i+5]:=s[i];

                        send(ASocket,sendbuff[1],118,0);

                        fillchar(FDSet,sizeof(FDSet),0);
                        FDSet.fd_array[0]:=ASocket;
                        FDSet.fd_count:=1;
                        select(0,@FDSet,nil,nil,nil);
                        FillChar(Buffer,5000,0);
                        Count:=recv(ASocket,Buffer[0],5000,0);

                        s:='другая ссылка из восьми символов на том же сайте';
                        //что делать дальше чтоб на том же сайте проверить другую ссылку?

                      end;
                    end;
                  end;
                end;
              end;
            end;
          end;
        end;
      end;
    end;
  end;
end;
я проверяю одну ссылку, получаю ответ, но если я дальше там же пытаюсь проверить следующую, то возвращается пустота. неужели нужно закрыть все сокеты, заново их создавать, конектиться и т д. какой запрос нужно послать чтобы проверить следующие ссылки не закрывая сокет?

п.с. текст в отправляемом буфере такой примерно:

Код:
  sendbuff:string='GET /******** HTTP/1.1'#13#10+
                  'Host: сайт'#13#10+
                  'Accept: text/html, */*'#13#10+
                  'Accept-Encoding: identity'#13#10+
                  'User-Agent: Mozilla/3.0'#13#10+
                  #13#10;
где символы в звездочках заменяются на ссылку.

помогите знатоки)
Biohazard вне форума   Ответить с цитированием
Старый 06.10.2014, 08:29   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,840
По умолчанию

Цитата:
неужели нужно закрыть все сокеты, заново их создавать, конектиться и т д.
Ну вообще-то да. Я ведь статью не зря дал.
I'm learning to live...
Stilet вне форума   Ответить с цитированием
Старый 06.10.2014, 14:09   #5
Biohazard
Пользователь
 
Регистрация: 23.02.2009
Сообщений: 78
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну вообще-то да. Я ведь статью не зря дал.
Я статью прочел, и, да действительно, она отвечает на вопрос "Да можно"
, но не говорит как,

Код:
procedure TThreal_Loader.Execute;
  var hSession,hFile:HINTERNET; s:string; Size,nbr:Cardinal;
  begin
    inherited;
    Loader.FContent:='';  Loader.ErrorString:='';
    //Откроем сессию.  Наш агент называется красивым женским именем.  
    hSession := InternetOpen('Анютка',INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
    // Если сессия открыта, хендл сесии создан
    if hSession<>nil then begin
      // Запросим файл с указанием всенепременно загрузить его с сервера
      hFile := InternetOpenURL(hSession, PChar(Loader.FURL), nil, 0,INTERNET_FLAG_RELOAD, 0);
      // Если запрос удался
      if hFile<>nil then begin
        // выясним сколько нужно памяти для первой порции
        InternetQueryDataAvailable(hFile,Size,0,0);
        // Если конечно сервер нас не пошлет, сказав, что порции не будет
        if Size<>0 then begin
          // Но пока он нам их отсыпает
          while Size<>0 do begin
            // мы с благодарностью протягиваем ладошки
            SetLength(s,Size);
            // и получаем очередную жменьку
            if not InternetReadFile(hFile,@s[1],Size,nbr) then break;
            // которую отдаем загрузчику на съедение со всей кожурой, и размерами
            Loader.FContent:=Loader.FContent+s;
            Loader.Portion:=s;
            Loader.PortionSize:=nbr;
            // о чем уведомляем основную программу - "Смотрите, а он семки хавает"
            if Assigned(Loader.FOnDownloadPortion) then Loader.FOnDownloadPortion(Loader);
            // не забыв о вежливости, приостанавливаемся на некоторое время
            // чтоб не загружать процессор, дав ему возможность поработать с другими
            // запущенными приложениями без напряга
            sleep(10);
            // После чего получаем размер очередной порции и опять в ту же степь
            InternetQueryDataAvailable(hFile,Size,0,0);
          end;
        end else begin
         //Если Размер файла по каким то причинам нулевой
         Loader.ErrorString:='Запрашиваемый файл пуст';  Loader.ErrorCode:=1;
         if Assigned(Loader.FOnError) then Loader.FOnError(Loader);
        end;
        // в конце загрузки не забываем закрыть хендл...
        InternetCloseHandle(hFile);
      end else begin
       //Если файл не открывается сгенерируем ошибку для обработки
       Loader.ErrorString:='Не могу открыть файл';  Loader.ErrorCode:=2;
       if Assigned(Loader.FOnError) then Loader.FOnError(Loader);
      end;
      // ...и освободить сессию
      InternetCloseHandle(hSession);
    end else begin
     //Если сессия не открывается сгенерируем ошибку для обработки
     Loader.ErrorString:='Не могу открыть сессию'; Loader.ErrorCode:=3;
     if Assigned(Loader.FOnError) then Loader.FOnError(Loader);
    end;
    // ну и по джентльменски уведомим программу об окончании загрузки
    if Assigned(Loader.FOnDoneLoad) then Loader.FOnDoneLoad(Loader);
  end;
предполагается что эта функция отвечает на вопрос, но возможно я просто не настолько проницателен, чтобы его увидеть, предполагаю что где то в цикле.. кстати это не винсок, а базирующаяся на нем вининит? есть прример на винсок? для моей задачи?

п.с. Я не лентяй, представленный мною в предыдущем сообщении код творение моих рук и анализа idhttp, и гугл я перерыл, но не увидел похожей ситуации, кто нибудь может помочь?
Biohazard вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скачать файл или страницу программно! alexrg Visual C++ 3 12.10.2013 08:38
Сделать страницу сайта поуже. MarinaPolnik Помощь студентам 1 06.08.2011 00:08
Php - на страницу сайта??? VintProg PHP 4 26.07.2010 07:13
скрипт пароля на страницу сайта Snejinka HTML и CSS 1 05.05.2010 21:42
Как сохранить страницу с сайта SeregaKo Общие вопросы Delphi 1 27.04.2009 10:53


06:44.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.