-
Добрый день. Функция получения html кода страницы из интернет. function down(url:string):string; var info:TWSADATA; sock:TSocket; addr:TSockAddr;
zapros:string; otvet:string; k:integer; buf:string; begin
if WSAStartup($101,info)<>0 then exit;
sock:=Socket(AF_INET,SOCK_STREAM,0);
if sock=INVALID_SOCKET then exit;
addr.sin_family:=AF_INET;
addr.sin_addr.S_addr:=inet_addr(pchar(GetIPAddress(url)));
addr.sin_port:=htons(80);
if Connect(sock,addr,SizeOf(addr))<>0 then exit;
zapros:='GET / HTTP/1.1'+#13#10+'Host:ya.ru'+#13#10#13#10;
send(sock,zapros[1],length(zapros),0);
SetLength(otvet,2000);
buf:='';
repeat
k:=Recv(sock,otvet[1],2000,0);
buf:=buf+copy(otvet,1,k);
until k<=0;
result:=buf;
end; Два вопроса. 1. функция send, как сделать правильно, то есть в цикле? как не пробовал - не выходит. 2. как изменить код, чтобы страница грузилась через http прокси, по этому вопросу вообще порожняк, ни одного примера в гугле не нашел, скажите хотя бы куда копать, если дадите ссылку на пример - буду очень благодарен.
-
> не выходит
Вот прямо так и говорит "не выхожу" ?
> скажите хотя бы куда копать
При таком уровне знаний копать в сторону готовых классов, например, THttpSend в составе Synapse.
-
> Вот прямо так и говорит "не выхожу" ? для примера пробовал в цикле отправлять по 10 байт, не работает, зацикливается, send всегда возвращает -1 i:=1;
repeat
k:=send(sock,zapros[i],10,0);
if k=0 then break;
i:=i+k;
until false;
-
> send всегда возвращает -1
Справка-то по-твоему для кого писана, для Пушкина ?)
if ...value of SOCKET_ERROR is returned..specific error code can be retrieved by calling WSAGetLastError.
И кто будет bind() вызывать ПЕРЕД connect() - тоже Пушкин ?)
-
спасибо, с send разобрались, bind добавили. function down():string; var info:TWSADATA; sock:TSocket; addr,addr_local:TSockAddr; zapros:string; otvet:string; k:integer; i:integer;
buf:string; begin
if WSAStartup($101,info)<>0 then exit;
sock:=Socket(AF_INET,SOCK_STREAM,0);
if sock=INVALID_SOCKET then exit;
addr_local.sin_family:=AF_INET;
addr_local.sin_addr.S_addr:=INADDR_ANY;
addr_local.sin_port:=0;
if bind(sock,addr_local,SizeOf(addr_local))=SOCKET_ERROR then exit;
addr.sin_family:=AF_INET;
addr.sin_addr.S_addr:=inet_addr(pchar(GetIPAddress('ya.ru')));
addr.sin_port:=htons(80);
if Connect(sock,addr,SizeOf(addr))<>0 then exit;
zapros:='GET / HTTP/1.1'+#13#10+'Host:ya.ru'+#13#10#13#10;
i:=1;
k:=0;
repeat
if length(zapros)-i+1<10 then k:=send(sock,zapros[i],length(zapros)-i+1,0) else
k:=send(sock,zapros[i],10,0);
i:=i+k;
until i=length(zapros)+1;
SetLength(otvet,2000);
buf:='';
repeat
k:=Recv(sock,otvet[1],2000,0);
buf:=buf+copy(otvet,1,k);
until k<=0;
result:=buf;
end; в send-е главная загвозка была в том, что размер посылаемых данных в последней итерации цикла должен строго равняться недоотправленным данным запроса, то есть осталось отправить 2 байта - надо через send 2 и отправлять. остались прокси??? с синапсом работал, ну его к бабушке, две строчки дописал и все, никакого интереса.
-
> ну его к бабушке, две строчки дописал и все, никакого интереса
Глупый ты) Синапс я тебе не только и не столько для готового использования в кач-ве "черного ящика" рекомендовал.. Исходники там ощутимо прозрачней и понятнее для ИЗУЧЕНИЯ, чем в том же, скажем, Инди.. Глянув в исх-ки Синапса понять как организуется работа клиента через прокси - проще простого)
-
уж каким мамка вырастила, спасибо за разъяснение.
|