Не работает функция проверки HTTP прокси серверасервера

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by RumShun, 4 Aug 2009.

  1. RumShun

    RumShun Member

    Joined:
    27 Oct 2008
    Messages:
    283
    Likes Received:
    75
    Reputations:
    6
    вобщем вот код
    Code:
      TProxy = record
       adrIA:TInAddr; 
       adr:string[15];
       port:integer;
      end;
    function checkHttp(Serv:String;Port:integer;proxy:TProxy):boolean;
    var
     sock:TSocket;
     addr:TSockAddrIn;
     Buff: array[0..255] of char;
    begin
     result:=false;
     FillChar(Addr.sin_zero, SizeOf(Addr.sin_zero), 0);
     addr.sin_family:=AF_INET;
     addr.sin_port:=htons(proxy.port);
     addr.sin_addr:=proxy.adrIA;
     connect(sock, @addr, SizeOf(addr));
     str:='CONNECT '+serv+':'+inttostr(port)+' HTTP/1.0\r\nUser-Agent: Opera/9.60\r\n';
     send(Sock,str,sizeof(str),0);
     FillChar(Buff,sizeof(Buff), 0);
     recv(sock2,Buff,sizeof(Buff),0);
     if buff[10]='2' then result:=true;
      closesocket(sock2);
    end;
    
    максимальное его упростил, пробовал уже и так и эдак, нифига не получаеться подвисает на
    recv(sock2,Buff,sizeof(Buff),0);
    потом ничего не принимает.
    вроде все просто, где чево не понимаю не могу найти. :confused:
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Проверь снифером правильно запрос идет или нет.
    Но главное - HTTP хидер должен заканчиваться на 2 CRLF

    А теперь самое главное:
    str:='CONNECT '+serv+':'+inttostr(port)+' HTTP/1.0\r\nUser-Agent: Opera/9.60\r\n';

    \r\n - это сишные и в Delphi такое не прокатит. и как видиш у тебя тока 1 CRLF вконце

    По этому перепиши:
    str:='CONNECT '+serv+':'+inttostr(port)+' HTTP/1.0'+#13#10+'User-Agent: Opera/9.60'+#13#10#13#10;

    СРазу видно что код не рабочий.
    str - вообще не объявлено нигде.
    если str - string
    то лучше send делать так:
    send(Sock,@str[1], length(str),0);

    А вообще судя по коду - это вообще недолно работать потому как ты даже сокет не создаеш. Выкини код и напиши нормальный, а не передирай из Си.
     
    1 person likes this.
  3. RumShun

    RumShun Member

    Joined:
    27 Oct 2008
    Messages:
    283
    Likes Received:
    75
    Reputations:
    6
    рабочий, просто выдран из контекста
    спасибо большое в этом проблема и была, переделал, все работает
    выдает ошибку Constant object cannot be passed as var parameter при компиляции (D6)
    send(Sock, str, sizeof(str), 0) работает нормально.
    :)
     
  4. St0nX

    St0nX Elder - Старейшина

    Joined:
    19 May 2007
    Messages:
    257
    Likes Received:
    46
    Reputations:
    0
    Code:
    int FindString(char *str1,char *str2)
    {
    int nstr1,nstr2,i,j,nstr,sstr;
    nstr1=strlen(str1);
    nstr2=strlen(str2);
    if(nstr1>nstr2)
    {
    nstr=nstr1-nstr2;
    for(i=0;i<nstr;i++)
    {
    sstr=0;
    for(j=0;j<nstr2;j++)
    {
    if(str1[j+i]==str2[j])
    {
    sstr++;
    }
    }
    if(sstr==nstr2)
    {
    return 1;
    }
    }
    }
    else
    {
    return -1;
    }
    return 0;
    }
    
    int CheckProxy(char *proxy, int port)
    {
    SOCKADDR_IN anAddr;
    anAddr.sin_family = AF_INET;
    anAddr.sin_addr.S_un.S_addr = inet_addr(proxy);
    anAddr.sin_port = htons(port);
    
    SOCKET  Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    int tmo = 3000;
    setsockopt(Socket,SOL_SOCKET,SO_RCVTIMEO,(const char*)&tmo,sizeof(tmo));
    
    int i;
    char Answer[40];
    char HTTPAnswer[] = "HTTP/1.1";
    connect(Socket, (struct sockaddr *)&anAddr, sizeof(struct sockaddr));
    //SOCKS
    char Message2[] = {0x05,0x01,0x00};
    send(Socket,Message2,3, 0);
    memset(Message2,0,3);
    recv(Socket, Message2, 3, 0);
    if(Message2[0]==0x05)
    {
    return 5;
    }
    else
    {
    //http
    char zSend[] = "GET / HTTP/1.1\r\nUser-Agent: Opera/9.63 (Windows NT 5.1; U; ru) Presto/2.1.1\r\nHost: www.google.com\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: ru-RU,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: deflate, gzip, x-gzip, identity, *;q=0\r\nCookie: rememberme=true;\r\nPREF=ID=cbb453ccc57c8739:TM=1228397956:LM=1228457555:GM=1:S=PD__kjM08drYVN99;\r\nNID=19=QiJDI3cjj8O4IHJ3M7LO81Clx9avdSixKEHLLgqFw1OtlYjy_Iqt-qOwO1WuTYj6_ZgNzf_eWRndnTWkAQ-N7hfii7nh7skDUtQtpMEsLFOq1MisvpHTzQn9g0FCZXwO;\r\nSID=DQAAAH0AAAAg2B1ks0PiX3lB6cSvZSSgCiGHwjea5TLv7CzWzH5q23MkMc7Ikj0h5pWoM4nrfSIVq-9upxKQd-QWc-NZkZNggOE425YOTsNEks-R3Zfae0k8tEpyLVG-aQI6zq90BlzIYB99XcDSfy\r\nb79S2_-80zTE82Q9PY-7VE5l2SrvTIw\r\nCookie2: $Version=1\r\nConnection: Keep-Alive, TE\r\nTE: deflate, gzip, chunked, identity, trailers\r\n\r\n";
    send(Socket,zSend,strlen(zSend), 0);
    recv(Socket, Answer, 40, 0);
    if(FindString(Answer,HTTPAnswer)==1)
    return 3;
    }
    
    closesocket(Socket);
    return -1;
    }
    Когда то писал... определяет тип и живая не живая