部分程序我已写好,可以通过不需要代理认证的http服务器,但公司里的http需要进行代理认证,我不知道代理这部分代码如何写,IE设置过代理地址后就可以上网了,我的程序就不行,我的机器是需要登录到域中的。。请各位指点,小弟特送二百分。

解决方案 »

  1.   

    是不是所有的http代理都可以用Connect IP:Prot  连接远程主机,还是需要开放才可以这样连接。
      

  2.   

    直接用CInternetSession,CHttpConnection
      

  3.   

    HTTP代理是在指定端口接受包,解析后在根据目的地址转发出去,和一般的SOCKET程序没有什么区别.IE访问INTERNET的方式也是如此,首先找到代理地址和端口,把要发送的包发给该
    地址,代理接收到包后再转发出去,当然代理的机器要再INTERNET网络上.你的程序如要通过代理访问远程主机器,只需要将包信息发送给代理机器就可以了,
    除了包头信息外,其余信息代理是不作处理的,具体格式可以参照http1.0协议,或者
    你拦截一下IE发送的包的格式分析一下.不知道你想问的是否是这些,不过代理服务器也大致如此吧,希望对你有帮助
      

  4.   

    先看一看Internet上clinet与Host之间的通讯是怎样进行的:
    1、在不设置代理的情况下,Client发送的ip包首先由ip协议栈判断其目标Host是否在同一网段,如果不在同一网段,该ip包将被送往Client所在网段的网关(路由器),由网关进行转发(路由)到目标Host。
    2、IE设置代理的情况下同volcary解释的一样。其实,此时HTTP代理就相当于连接你的Client所在网段与Internet之间的一个"网关。IE在设置代理和不设置代理的情况下,其发送的HTTP头的数据是不一样的,代理要对其进行相应的修改后再将其转发给目标主机。你的问题有两种解决办法:
    1、不对你现有的程序进行任何的修改,修改你的Client的网络配置,将Http代理服务器的IP设为Client的网关即可!
    2、同zheng017的建议一样,直接用CInternetSession,CHttpConnection
      

  5.   

    网络配置是正常了,用IE可以上网了,但我用程序来连接远程主机就不行了,我想用程序实现。
    我不想用CInternetSession,CHttpConnection,想直接用Socket api实现,大家请指点指点,最好是给点代码参考参考
      

  6.   

    see this.
    http://www.codeproject.com/internet/httptunneling.asp
      

  7.   

    我的远程主机开一个80端口,不是WEB服务,我需要在内网中通过我们的代理服务器和它进行通讯。
    代理服务器只开http代理需要要认证的,我的程序现在可以通过不需要认证的http代理,但不知道如何写和代理服务器认证的代码。请各位做过的,给点代码好吗,不要讲理论,理论谁都会。
    或给些通讯协议。。
      

  8.   

    Http的认证与Http头有关系。
    这种情况我也第一次遇到。
    总的感觉是你必须和HTTP代理进行交互。获得将认证信息打包在HTTP头里。
    代码没有编过,不过可能的话可以互相研究研究。
      

  9.   

    //创建一个CInternetSession 对象
    CInternetSession  CIS=  new CInternetSession("pstrAgentName".....);
    //设置代理认证参数
    //lpPassword 口令Buffer指针,
    //lpUserName 用户名buffer指针 
    CIS.SetOption(INTERNET_OPTION_PROXY_PASSWORD,lpPassword,PasswordLength);
    CIS.SetOption(INTERNET_OPTION_PROXY_USERNAME,lpUserName,UserNameLength);
    //由CInternetSession对象创建CHttpConnection对象指针
    CHttpConnection * CHC = CIS.GetHttpConnection(...);
    CHttpFile * pFile = CHC.OpenRequest(....);
    ....
      

  10.   

    代理认证只不过比不需要代理认证在OnConnect后多一步,用户和密码需要按base64换算过来,BASE64 编码换算方法可以在网上找,其它的可以看rfc.如果想看代码可以到VChelp.net去找,其中有个的小程序里就有base64的编码的代码。
      

  11.   

    口令及密码要进编码到没有关系,假如我对口令和密码进行了编码,如何传给http服务器呀。我想总有格式的吧。。
    还请大家指点指点。。
      

  12.   

    //见rfc2617 --  2 Basic Authentication SchemeCONNECT IP:Port HTTP/1.1\r\nProxy-Authorization:Basic Base64编码\r\n\r\n
      

  13.   

    Proxy-Authorization:Basic Base64编码\r\n\r\n
    这里有用户名和密码是连接在一起的还有用什么分隔符分开的。
      

  14.   

    Base64编码是 “用户名:密码”进行编码的到的串
      

  15.   

    整个过程是这样     CLIENT -> SERVER                        SERVER -> CLIENT
         --------------------------------------  -----------------------------------
         CONNECT home.netscape.com:443 HTTP/1.0
         User-agent: Mozilla/4.0
         <<< empty line >>>
                                                 HTTP/1.0 407 Proxy auth required
                                                 Proxy-agent: Netscape-Proxy/1.1
                                                 Proxy-authenticate: ...
                                                 <<< empty line >>>
         CONNECT home.netscape.com:443 HTTP/1.0
         User-agent: Mozilla/4.0
         Proxy-authorization: ...
         <<< empty line >>>
                                                 HTTP/1.0 200 Connection established
                                                 Proxy-agent: Netscape-Proxy/1.1
                                                 <<< empty line >>>
                      <<< data tunneling to both directions begins >>>
      

  16.   

    还有一个问题也许要注意,你用的代理服务器是什么?如果是msproxy的话,这个方法好象就不适用了,msproxy的身份验证信息不是用base64编码的
      

  17.   

    Kevin_qing() NTLM验证 如何做,能讲的详细一点吗?
    我的代理是Msproxy....
      

  18.   

    如果用类来实现,将自动检验代理的设置!而使用socket,则需要将代理设置按照正确的传输来加入到tcp/ip包里面!