Конференция "Сети" » сокеты, получить страницу через прокси
 
  • tippa (24.12.10 21:32) [0]
    Добрый день.
    Функция получения html кода страницы из интернет.
    function down(url:string):string;//передаем урл('ya.ru'), получаем html код
    var info:TWSADATA;//библиотека сокетов
       sock:TSocket;//сокет
       addr:TSockAddr;
       zapros:string;//посылаемый запрос
       otvet:string;//получаемый ответ
       k:integer;//счетчик отправленных, принятых байт
       buf:string;// html код получаемой страницы
    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 прокси, по этому вопросу вообще порожняк, ни одного примера в гугле  не нашел, скажите хотя бы куда копать, если дадите ссылку на пример - буду очень благодарен.
  • Сергей М. © (24.12.10 22:09) [1]
    > не выходит

    Вот прямо так и говорит "не выхожу" ?

    > скажите хотя бы куда копать

    При  таком уровне знаний копать в сторону готовых классов, например, THttpSend в составе Synapse.
  • tippa (24.12.10 22:49) [2]
    > Вот прямо так и говорит "не выхожу" ?

    для примера пробовал в цикле отправлять по 10 байт, не работает, зацикливается, send всегда возвращает -1
    i:=1;
    repeat
    k:=send(sock,zapros[i],10,0);
    if k=0 then break;
    i:=i+k;
    until false;

  • Сергей М. © (24.12.10 23:06) [3]
    > send всегда возвращает -1

    Справка-то по-твоему для кого писана, для Пушкина ?)

    if ...value of SOCKET_ERROR is returned..specific error code can be retrieved by calling WSAGetLastError.


    И кто будет bind() вызывать ПЕРЕД connect() - тоже Пушкин ?)
  • tippa (25.12.10 09:48) [4]
    спасибо, с send разобрались, bind добавили.

    function down():string;//получаем html код ya.ru
    var info:TWSADATA;//библиотека сокетов
       sock:TSocket;//сокет
       addr,addr_local:TSockAddr;//адреса для connect и bind
       zapros:string;//посылаемый запрос
       otvet:string;//получаемый ответ
       k:integer;//счетчик отправленных, принятых байт
       i:integer;
       buf:string;// html код получаемой страницы
    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;

    //посылаем в цикле по 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 и отправлять.

    остались прокси???
    с синапсом работал, ну его к бабушке, две строчки дописал и все, никакого интереса.
  • Сергей М. © (25.12.10 19:42) [5]

    > ну его к бабушке, две строчки дописал и все, никакого интереса


    Глупый ты)
    Синапс я тебе не только и не столько для готового использования в кач-ве "черного ящика" рекомендовал.. Исходники там ощутимо прозрачней и понятнее для ИЗУЧЕНИЯ, чем в том же, скажем, Инди.. Глянув  в исх-ки Синапса понять как организуется работа клиента через прокси - проще простого)
  • tippa (25.12.10 22:00) [6]
    уж каким мамка вырастила, спасибо за разъяснение.
 
Конференция "Сети" » сокеты, получить страницу через прокси
Есть новые Нет новых   [134436   +25][b:0][p:0.002]