|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
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
|
||||
|
||||
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#3
|
|||
|
|||
Цитата:
|
#4
|
||||
|
||||
Пишу программы за еду. __________________ |
Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
reqyz (05.10.2014)
|
#6
|
|||
|
|||
в общем сейчас есть такой длинный извращенный, но рабочий код, в конце пока не дописанный (нет закрытия сокетов)
Код:
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; где символы в звездочках заменяются на ссылку. помогите знатоки) |