透过代理看世界 用VC++实现http代理

Tags: vc
 为了帮网友些个用http下载动画的程序,临时在网上翻了翻,看看有没有利用http代理来下载的例子。结果,似乎很多人都愿意去转载一个有头无尾的例子,还美其名曰“我在查阅RFC文档和相关资料后,特总结一些TCP协议穿透代理服务器的程序片断,希望对大家有所帮助。”

  如果真的想帮助大家,为什么不说的详细一些?

  无奈之下,自己去翻rfc文档,找了些资料,写了这个利用http代理来下载文件的资料

  代码如下:

  (1)一些基本变量

SOCKET                                    HTTPSocket;   // 主socket
struct sockaddr_in                   SocketAddr;   // address socket
struct sockaddr_in                   BindSocket;   // for bind


int   m_nRecvTimeout;  // recieve timeout
int   m_nSendTimeout;  // send timeout

WSADATA           wsaData;

// 要下载文件部分。好像在BindSocket.sin_addr.s_addr = inet_addr (strHost);时,只能使用ip地址,所以了。。。

// 如果谁知道更好的方法,别忘了告诉我一下。

CString strHost="111.111.111.111 ";
CString DownLoadAddress="http://www.aitenshi.com/bbs/images/";
CString hostFile="logo.gif";
int HttpPort=80;


  (2)一些函数,用来取得http头,和获取文件大小

int GetFileLength(char *httpHeader)
{
        CString strHeader;
         int local;
         strHeader=(CString)httpHeader;
         local=strHeader.Find("Content-Length",0);
         local+=16;
         strHeader.Delete(0,local);
         local=strHeader.Find(" ");
         strHeader.SetAt(local, );

         char temp[30];
         strcpy(temp,strHeader.GetBuffer(strHeader.GetLength()));
         return atoi(temp);
}

int GetHttpHeader(SOCKET sckDest,char *str)
{
         BOOL m_bResponsed=0;
         int m_nResponseHeaderSize;

         if(!m_bResponsed)
         {
                  char c = 0;
          int nIndex = 0;
          BOOL bEndResponse = FALSE;
          while(!bEndResponse && nIndex < 1024)
          {
                   recv(sckDest,&c,1,0);
                   str[nIndex++] = c;
                   if(nIndex >= 4)
                   {
                            if(str[nIndex - 4] == && str[nIndex - 3] ==
                             && str[nIndex - 2] == && str[nIndex - 1] == )
                            bEndResponse = TRUE;
                   }
          }
          m_nResponseHeaderSize = nIndex;
          m_bResponsed = TRUE;
         }
 
 return  m_nResponseHeaderSize;
 
}

  (3)用来发送的部分

void szcopy(char* dest,const char* src,int nMaxBytes)
{
         int i_cntr=0;
         while ((src[i_cntr]!= ) || (i_cntr<nMaxBytes))
                    dest[i_cntr]=src[i_cntr++];
         dest[i_cntr]= ;
}

BOOL SocketSend(SOCKET sckDest,const char* szHttp)
{

    char szSendHeader[MAXHEADERLENGTH];
    int iLen=strlen(szHttp);
    szcopy(szSendHeader,szHttp,iLen);
    if(send (sckDest  ,(const char FAR *)szSendHeader ,iLen ,0)==SOCKET_ERROR)
    {
               closesocket(sckDest);
               AfxMessageBox("Error when send");
                return FALSE;
    }

    return TRUE;
}

BOOL SocketSend(SOCKET sckDest,CString szHttp)
{

    int iLen=szHttp.GetLength();
    if(send (sckDest,szHttp,iLen,0)==SOCKET_ERROR)
    {
               closesocket(sckDest);
               AfxMessageBox("Error when send");
                return FALSE;
    }

    return TRUE;
}

  (4)用于连接的函数

  这里是做了一些连接用的操作,分了两种情况

  1)如果没有使用代理,则直接连到你指定的计算机

  2)如果使用了代理,则直接连到代理

BOOL CDLAngelDlg::ConnectHttp()
{

 message="正在建立连接 ";


  UpdateData(TRUE);
 if(m_combo=="HTTP")    // m_combo 一个下拉条
 {
           HTTPSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
            SocketAddr.sin_addr.s_addr = inet_addr (m_ProxyAddr);
            SocketAddr.sin_family=AF_INET;
            SocketAddr.sin_port=htons(atoi(m_Port));

            struct fd_set fdSet;
            struct timeval tmvTimeout=

本文链接:http://www.4byte.cn/learning/67554.html