我使用Wininet来写通过代理服务器访问外网,遇到一个问题
比如我要下载外网的一个文件,通过代理服务器返回状态代码为:200, 但接收数据后发现是一个Html页面,这个页面其实是由代理服务器返回的,并没有真正的访问到外网的文件, 返回的信息用IE打开后是这样的:帐号认证失败 ...
IP 地址: 192.168.1.236
MAC 地址: 
服务端时间: 2009-04-24 09:25:14
验证结果: 无效用户.由于状态代码为200(200表示成功),我无法判断这是一个错误,这里应该是要怎么判断才能知道这次的访问是出错的呢?

解决方案 »

  1.   

    这说明你用的是socket5代理,socket5代理是需要用户名和密码,用http代理比较方便好用,不需要认证。
      

  2.   

    一般的代理服务器需要验证啊。常用的Socket5代理和http代理,http代理一般有BASIC,DIGEST,NTLM等常用的验证方式
      

  3.   

    很显然,你在联接代理服务器时没有提供用户名及密码,你可以使用下面的代码试一下://通过HTTP方式代理   
        
      if(   !ClientSock.Connect(   g_ProxyInfo.m_strProxyIP,g_ProxyInfo.m_nProxyPort)   )   
      {   
      m_sError   =   _T("不能连接到代理服务器!");   
      ClientSock.Close();   
      return   FALSE;   
      }   
      char   buff[600];   
      sprintf(   buff,   "%s%s:%d%s","CONNECT   ",GetServerHostName(),GetPort(),"   HTTP/1.0\r\nUser-Agent:   MyApp/0.1\r\n\r\n");   
      ClientSock.Send(buff,strlen(buff));   //发送请求   
      memset(buff,0,600);   
      ClientSock.Receive(buff,600);   
      if(strstr(buff,   "200   Connection   established")   ==   NULL)   //连接不成功   
      {   
      m_sError   =   _T("通过代理连接主站不成功!");   
      ClientSock.Close();   
      return   FALSE;   
      }         
    而sock5是这样的   
      1.连接服务器:   
      2.发送验证方法列表给服务器,进行验证,就算不要密码也需要进行此步   
      3.发送命令   
        
      第二步的命令是:   
      cnt,method   
        
      即发送的byte意义为,验证方法列表,验证方法代码。   
      一般使用   
        
      02(2种验证),00(无验证法),01(user:pwd验证法)  
    o     REP         Reply   field:   
                                o     X'00'   succeeded   
                                o     X'01'   general   SOCKS   server   failure   
                                o     X'02'   connection   not   allowed   by   ruleset   
                                o     X'03'   Network   unreachable   
                                o     X'04'   Host   unreachable   
                                o     X'05'   Connection   refused   
                                o     X'06'   TTL   expired   
                                o     X'07'   Command   not   supported   
                                o     X'08'   Address   type   not   supported   
                                o     X'09'   to   X'FF'   unassigned
    bool TmSocketS::AuthenticationV5()   
      {   
      char   SockSCmd[512+10];   
      SockSCmd[0]=5;   
      SockSCmd[1]=2; //     supports   two   authentication   currently   
      SockSCmd[2]=0; // NO   authentication   
      SockSCmd[3]=2; // USERNAME/PASSWORD   authentication   
      // The   values   currently   defined   for   METHOD   are:   
      //     o     X'00'   NO   AUTHENTICATION   REQUIRED   
      // x     X'01'   GSSAPI   
      // o     X'02'   USERNAME/PASSWORD   
      // x     X'03'   to   X'7F'   IANA   ASSIGNED   
      // x     X'80'   to   X'FE'   RESERVED   FOR   PRIVATE   METHODS   
      // o     X'FF'   NO   ACCEPTABLE   METHODS   
      TmSocket::Send(SockSCmd,4);   
      if(TmSocket::Recv(SockSCmd,2)==2)   
      {   
      if(SockSCmd[0]==5)   
      {   
      switch(SockSCmd[1])   
      {   
      case 0:   
      #ifdef __DEBUG_CSOCKET   
      printf("SOCKSV5   NO   authentication\n");   
      #endif   
      return   true;   
      case 2:   
      {   
      int   szUser=sUser.length();   
      int szPwd=sPassword.length();   
      if(   (szUser>255)||   (szPwd>255)   ||   
      (szUser<=0)   ||   (szPwd<=0   )   )   
      {   
      error   =   SOCKS5ERR_AUTHFAILED;   
      return   false;   
      }   
        
      SockSCmd[0]=1;   
      SockSCmd[1]=szUser;   ---------------------------用户名
      memcpy(SockSCmd+2,sUser.c_str(),szUser);   
      SockSCmd[2+szUser]=szPwd;  ---------------------------密码
      memcpy(SockSCmd+3+szUser,sPassword.c_str(),szPwd);   
        
      TmSocket::Send(SockSCmd,3+szUser+szPwd);   
      #ifdef __DEBUG_CSOCKET   
      printf("Start   sockS5   username/password   authentication\n");   
      #endif   
        
      if(TmSocket::Recv(SockSCmd,2)==2)   
      {   
      if(   (SockSCmd[0]==5)&&   
      (SockSCmd[1]==0)   )   
      {   
      #ifdef __DEBUG_CSOCKET   
      printf("Authentication   succefully!\n");   
      #endif   
      return   true;   
      }   
      }   
      #ifdef __DEBUG_CSOCKET   
      printf("Authentication   failed!\n");   
      #endif   
      error=SOCKS5ERR_AUTHFAILED;   
      return   false;   
      }   
        
      default:   
      ;   
      }   
      }   
      }   
      error=SOCKS5ERR_NOAUTHMETH;   
      return   false;   
      }