Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.10.2014, 19:49
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
Смущение 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?) но подозреваю что такое добро вполне быть может)

Последний раз редактировалось reqyz, 04.10.2014 в 20:01.
Ответить с цитированием
  #2  
Старый 04.10.2014, 19:52
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

http://autoit-script.ru/autoit3_docs...ns/InetGet.htm
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 04.10.2014, 19:58
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Спасибо, на этой ссылке был уже сегодня, тестил, но работает не быстрее чем описанные мною способы, поэтому практической значимости для этой задачи не имеет
Ответить с цитированием
  #4  
Старый 05.10.2014, 09:04
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Windows HTTP Services
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
reqyz (05.10.2014)
  #5  
Старый 05.10.2014, 20:17
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 576
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от NumLock
Это та самая служба, которую я обычно запрещаю, чтобы не качала чего почем зря?
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
  #6  
Старый 06.10.2014, 05:15
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

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

Код:
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;

где символы в звездочках заменяются на ссылку.

помогите знатоки)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:36.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter