加载中…
正文 字体大小:

验证码样本批量下载

(2013-01-29 14:24:22)
工具下载地址:http://pan.baidu.com/share/link?shareid=260194&uk=3120909006
淘宝
验证码样本批量下载

139邮箱
验证码样本批量下载

人人网
验证码样本批量下载

//Created by pritry

#pragma once

#include<winsock2.h>
#include<stdio.h>

using namespace std;   

#pragma comment(lib, "ws2_32.lib") 

#pragma warning(disable:4996)

#define  URL_MAX_LENGTH        1024
#define  BUFFER_SIZE           512
#define  DEFAULT_HTTP_PORT     80

class CMessageBuffer
{
public:
 CMessageBuffer(void);
 ~CMessageBuffer(void);
 void Clear();
 void Init(int n);
 void Add(char* p, int n);
 void Copy(CMessageBuffer* p);
 int FillSize();
 const char* GetBuffer();

protected:
 char*           m_pBuffer;
 char*           m_pFill;
 int             m_nSize;
};

CMessageBuffer::CMessageBuffer()
{
 m_pBuffer = NULL;
 m_pFill = NULL;
 m_nSize = 0;
}

CMessageBuffer::~CMessageBuffer()
{
 Clear();
}

int CMessageBuffer::FillSize()
{
 return (int)(m_pFill - m_pBuffer);
}

const char* CMessageBuffer::GetBuffer()
{
 return m_pBuffer;
}

void CMessageBuffer::Clear()
{
 if(m_pBuffer != NULL)
 {
  delete []m_pBuffer;

  m_nSize = 0;
  m_pFill = NULL;
  m_pBuffer = NULL;
 }
}

void CMessageBuffer::Init(int n)
{
 Clear();

 if(n > 0)
 {
  m_pBuffer = new char[n];
  m_pFill = m_pBuffer;
  m_nSize = n;
 }
}

void CMessageBuffer::Add(char* p, int n)
{
 if(n > 0)
 {
  if(FillSize() + n > m_nSize)
  {
   char* q = m_pBuffer;
   int fill_size = FillSize();

   m_nSize = fill_size + n*2;

   m_pBuffer = new char[m_nSize];
   m_pFill = m_pBuffer + fill_size;

   if(q != NULL)
   {
    memcpy(m_pBuffer, q, fill_size);
    delete[] q;
    q = NULL;
   }
  }

  memcpy(m_pFill, p, n);
  m_pFill = m_pFill + n;
 }
}

void CMessageBuffer::Copy(CMessageBuffer* p)
{
 if(p != NULL && p->FillSize() > 0)
 {
  Init(p->FillSize());

  memcpy(m_pBuffer, p->GetBuffer(), p->FillSize());
 }
}

class CWebImage
{
public:
 CWebImage(void);
 ~CWebImage(void);

 
 bool FetchImage(char* szURL, char* szFileName);
protected:
 bool Initialize(char* szURL);
 void Clear();

 inline bool SendHttpGet(CMessageBuffer* p);
 inline bool RecvHttpResponse(CMessageBuffer* pHead, CMessageBuffer* pContent);
 inline bool WriteImage(CMessageBuffer* p, char* szFileName);
 inline bool ParseURLRequest(char* szURL, char* szHost, int& nPort);
 inline DWORD GetHostAddress(const char* szHost);  
protected:
 SOCKET                  m_hsock;
 bool                    m_bInit;
 CMessageBuffer          m_request;
};

CWebImage::CWebImage(void)
{
 m_bInit = false;
}

CWebImage::~CWebImage(void)
{
 Clear();
}

inline bool CWebImage::ParseURLRequest(char* szURL, char* szHost, int& nPort)
{
 if(szURL == NULL || szHost == NULL) return false;

 char sz[URL_MAX_LENGTH];
 char* p = strchr(szURL, ':') + 1;
 char* q = NULL;
 int n = (int)strlen(szURL);

 if(p != NULL)
 {
  lstrcpyn(sz, szURL, (int)(p-szURL));

  strupr(sz);

  if(strcmp(sz, "HTTP"))
  {
   return false;
  }
 }

 nPort = DEFAULT_HTTP_PORT;

 if(*p == '/' && *(p+1) == '/')
 {
  p += 2;
 }
 else if(*p == '/' && *(p+1) != '/')
 {
  return false;
 }

 q = p;

 while(*q != '/' && *q != '\0')
 {
  ++q;
 }

 lstrcpyn(szHost, p, (int)(q-p+1));
 strupr(szHost);

 n = n - int(q - p);

 p = strchr(szHost, ':');  


 if(p != NULL)   
 {
  *p = '\0';
  nPort = atoi(p+1);   
   

 //  协议
    // GET /index.html HTTP/1.0
    //  Host: www.abc.com
    //  Connection:Keep-Alive

 m_request.Clear();

 strcpy(sz, "GET ");
 strcat(sz, q);
 strcat(sz, " HTTP/1.0\r\n");

 strcat(sz, "HOST: ");
 strcat(sz, szHost);
 strcat(sz, "\r\n");

 strcat(sz, "Connection:keep-alive\r\n");

 strcat(sz, "\r\n");

 printf("%s", sz);

 m_request.Add(sz, (int)strlen(sz));

 return true;
}

inline DWORD CWebImage::GetHostAddress(const char* szHost)   
  
 struct hostent *pht;   
 char *p;   

 if((pht = gethostbyname(szHost)) == NULL)
 {
  return 0;
 }

 p = *pht->h_addr_list;

 return *((DWORD*)p);   
  

bool CWebImage::Initialize(char* szURL)
{
 if(!m_bInit)
 {
  WSADATA wsData;   
  SOCKADDR_IN sin;
  char szHost[URL_MAX_LENGTH];

  int r;
  int nPort;
  
  if((r = WSAStartup(0x0101, &wsData)) != 0)
  {
   return false;
  }

  if((m_hsock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
  {
   return false;
  }

  if(!ParseURLRequest(szURL, szHost, nPort))
  {
   return false;
  }

  sin.sin_family = AF_INET;                                          
  sin.sin_port = htons(nPort);    //端口
  sin.sin_addr.s_addr = GetHostAddress(szHost);   

  if(connect(m_hsock, (sockaddr*)&sin, sizeof(SOCKADDR_IN)) == SOCKET_ERROR)   
    
   return false;   
    

  m_bInit = true;
 }

 return true;
}

void CWebImage::Clear()
{
 if(m_bInit)
 {
  closesocket(m_hsock);                                          
  WSACleanup();

  m_bInit = false;
 }
}

bool CWebImage::FetchImage(char* szURL, char* szFileName)
{
 if(!Initialize(szURL))
 {
  return false;
 }

 CMessageBuffer httphead;
 CMessageBuffer httpcontent;

 if(!SendHttpGet(&m_request))
 {
  return false;
 }

 if(!RecvHttpResponse(&httphead, &httpcontent))
 {
  return false;
 }

 if(!WriteImage(&httpcontent, szFileName))
 {
  return false;
 }

 Clear();

 return true;
}

inline bool CWebImage::SendHttpGet(CMessageBuffer* p)
{
 if(p == NULL || send(m_hsock, p->GetBuffer(), p->FillSize(), 0) == SOCKET_ERROR)
 {
  return false;
 }

 return true;
}

inline bool CWebImage::RecvHttpResponse(CMessageBuffer* pHead, CMessageBuffer* pContent)
{
 if(pHead != NULL && pContent != NULL)
 {
  char buffer[BUFFER_SIZE] = { 0 };
  int n;

  pHead->Clear();
  pContent->Clear();

  //协议头
  while((n = recv(m_hsock, buffer, 1, 0)) > 0)
  {
   pHead->Add(buffer, 1);

   if(buffer[2] == '\n' && buffer[1] == '\r' && buffer[0] == '\n')
   {
    break;
   }

   buffer[2] = buffer[1];
   buffer[1] = buffer[0];
  }

  //printf("head::\n%s\n", pHead->GetBuffer());

  //协议内容
  while((n = recv(m_hsock, buffer, BUFFER_SIZE, 0)) > 0)
  {
   pContent->Add(buffer, n);
  }

  //printf("content::\n%s\n", pContent->GetBuffer());

  return true;
 }

 return false;
}

inline bool CWebImage::WriteImage(CMessageBuffer* p, char* szFileName)
{
 if(p != NULL && szFileName != NULL)
 {
  FILE* pFile = fopen(szFileName, "wb");

  if(pFile != NULL)
  {
   fwrite(p->GetBuffer(), p->FillSize(), 1, pFile);

   fclose(pFile);

   return true;
  }
 }

 return false;
}

0

阅读 评论 收藏 转载 喜欢 打印举报
前一篇:ray tracing
  • 评论加载中,请稍候...
发评论

       

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

    < 前一篇ray tracing
      

    新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有