C++ 如何通过代理将套接字连接到http服务器?

C++ 如何通过代理将套接字连接到http服务器?,c++,c,linux,proxy,network-programming,C++,C,Linux,Proxy,Network Programming,最近,我用C语言编写了一个程序,使用套接字连接到本地运行的HTTP服务器,从而对该服务器进行请求 这对我很管用。之后,我尝试使用相同的代码连接到web上的另一个服务器(例如www.google.com),但我无法连接,并从网络中的代理服务器获得另一个html响应 我的本地IP是:10.0.2.58 代理IP为:10.0.0.1 这是我得到的答复: HTTP/1.1 302 Found Expires: Fri, 10 Feb 2012 12:47:35 GMT Expires: 0 Cach

最近,我用C语言编写了一个程序,使用套接字连接到本地运行的HTTP服务器,从而对该服务器进行请求

这对我很管用。之后,我尝试使用相同的代码连接到web上的另一个服务器(例如www.google.com),但我无法连接,并从网络中的代理服务器获得另一个html响应

  • 我的本地IP是:10.0.2.58
  • 代理IP为:10.0.0.1
这是我得到的答复:

HTTP/1.1 302 Found
Expires: Fri, 10 Feb 2012 12:47:35 GMT
Expires: 0
Cache-Control: max-age=180000
Cache-Control: no-store, no-cache, must-revalidate
Cache-Control: post-check=0, pre-check=0
Pragma: no-cache
Connection: close
Location: http://10.0.0.1:8000/index.php?redirurl=http%3A%2F%2F10.0.2.58%2F
Content-type: text/html
Content-Length: 0
Date: Wed, 08 Feb 2012 10:47:35 GMT
Server: lighttpd/1.4.29
如何绕过此代理连接到外部服务器


尝试使用CONNECT时得到响应
连接到本地apache的工作代码
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义最大缓冲区大小1024
int main(int argc,char*argv[])
{
内部clsd、ssd、状态;
字符缓冲区[1024];
char请求[]=“GET/HTTP/1.1\r\n主机:10.0.2.58\r\n\r\n”;
srvr_addr中的结构sockaddr_;
结构addrinfo提示,*res;
srvr\u addr.sin\u family=AF\u INET;
srvr地址sin端口=htons(80);
srvr_addr.sin_addr.s_addr=inet_addr(“10.0.2.58”);//本地服务器
clsd=套接字(AF_INET、SOCK_STREAM、IPPROTO_TCP);

如果(clsd要通过代理使用连接(或者如果它们是隐式代理),首先您应该连接到代理,向目标主机发送“connect”消息;代理将建立连接并返回数据

以下是步骤:

  • 打开代理主机的套接字
  • 发送“连接HTTP/1.0\r\n\r\n”字符串
  • 等待recv
  • 您必须使用结束换行符指定协议(在我们的示例中是HTTP 1.0,非分块),以便代理知道如何与端点通信


    你可以在

    上找到连接方法的详细信息,如果你特别想绕过代理,你应该和管理你网络的人谈谈,看看这是否可行。如果你的第一个输出块是试图连接到谷歌,那么在我看来,你的网络上有某种透明的代理你必须采取特殊的(和特定于网络的)步骤来绕过


    当然,如果你只是对获取数据感兴趣,你可以尝试遵循重定向…

    人们怎么会在文章的末尾出现许多随机换行符?Mess>。是的,网络中的代理是透明的,我想是这样。我怎么能绕过它呢?我可以使用firefox和所有工具获取页面,就像这样我怎么才能获取使用我自己的代码的页面?如果代理正在捕获端口80(可能更多)上的所有传出流量,那么您需要与运行代理的任何人交谈-他们将能够告诉您(1)您是否可以绕过它(2)如何绕过它(3)如果无法绕过,您应该做什么。好:)现在您必须重定向。“HTTP/1.1 302已找到”是来自服务器的响应,它指示您读取“位置:”,从响应中分离并转到它。但是,当我复制重定向url并在浏览器中尝试它时,它将我重定向到代理管理员的页面。在我看到一些代码之前,有点难以猜测。您是否尝试使用telnet?检查此项:,除了端口25,您应该使用80。dennis,代理是一个透明的,所以我没有得到telnet响应,它总是显示试图连接好,如果代理是透明的,那么所有的包都必须通过它,没有发送者的知识,连接到google.com应该没有问题。我检查了你的代码(假设你知道你没有连接到google,而是连接到某个内部机器)而且它应该可以工作(在由于粘贴不完整而填充缺少的代码之后)。
    HTTP/1.1 302 Found
    Expires: Fri, 10 Feb 2012 13:37:58 GMT
    Expires: 0
    Cache-Control: max-age=180000
    Cache-Control: no-store, no-cache, must-revalidate
    Cache-Control: post-check=0, pre-check=0
    Pragma: no-cache
    Connection: close
    Location: http://10.0.0.1:8000/index.php?redirurl=http%3A%2F%2F10.0.2.58http%3A%2F%2Fwww.google.com%2F
    Content-type: text/html
    Content-Length: 0
    Date: Wed, 08 Feb 2012 11:37:58 GMT
    Server: lighttpd/1.4.29
    
    #include<unistd.h>
    #include<stdio.h>
    #include<sys/types.h>
    #include<sys/socket.h>
    #include<netinet/in.h>
    #include<arpa/inet.h>
    #include<netdb.h>
    #include<string.h>
    
    #define MAX_BUFFER_SIZE 1024
    
    int main(int argc,char *argv[])
    {
      int clsd,ssd,status;
      char buffer[1024];
      char request[]="GET / HTTP/1.1\r\nHost:10.0.2.58\r\n\r\n";
      struct sockaddr_in srvr_addr;
    
      struct addrinfo hints,*res;
    
      srvr_addr.sin_family=AF_INET;
      srvr_addr.sin_port=htons(80);
      srvr_addr.sin_addr.s_addr=inet_addr("10.0.2.58");//Local server
    
      clsd =socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
      if(clsd<=0)
      {
            perror("Socket init failed..\n");return 1;
      }
      ssd=connect(clsd,(struct sockaddr *)&srvr_addr,(socklen_t)(sizeof srvr_addr));
      if(clsd<=0)
      {
            perror("Socket connect failed..\n");return 1;
      }
      write(clsd,request,strlen(request));
      memset((void *)&request,0x00,strlen(request));
      memset(&buffer,0x00,MAX_BUFFER_SIZE);
    
     do
     {
      status=read(clsd,&buffer,MAX_BUFFER_SIZE);
      write(1,&buffer,status);
     memset((void *)&request,0x00,strlen(request));
      memset(&buffer,0x00,MAX_BUFFER_SIZE);
    
     do
     {
      status=read(clsd,&buffer,MAX_BUFFER_SIZE);
      write(1,&buffer,status);
     }while(status>0);
     close(clsd); 
     return 0;
    }