头文件:

#pragma once

#include <afxinet.h>

class CSF_HttpDataReader
{
public:
CSF_HttpDataReader(void);
~CSF_HttpDataReader(void); public:
int GetHttpData(CString strUrl,char* buf,int bufSize, int tc = );
};

源文件:

#include "StdAfx.h"
#include "SF_HttpDataReader.h" CSF_HttpDataReader::CSF_HttpDataReader(void)
{
} CSF_HttpDataReader::~CSF_HttpDataReader(void)
{
} typedef struct tagASYNC_HTTP_CONTEXT
{
HANDLE hEvent;
CString strUrl;
char* buf;
int bufSize; int nRead;
}ASYNC_HTTP_CONTEXT; UINT ThreadProc_HttpRead(LPVOID lpParam)
{
ASYNC_HTTP_CONTEXT* pCon = (ASYNC_HTTP_CONTEXT*)lpParam; int nLen;
int nRead = ; CInternetSession ss(L"HttpClient",,INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,INTERNET_FLAG_DONT_CACHE);
CHttpFile* pFile = NULL;
try
{
pFile = (CHttpFile*)ss.OpenURL(pCon->strUrl, ,
INTERNET_FLAG_TRANSFER_ASCII|INTERNET_FLAG_DONT_CACHE|INTERNET_FLAG_KEEP_CONNECTION|INTERNET_FLAG_NO_COOKIES);
//pFile = (CHttpFile*)ss.OpenURL(pCon->strUrl);
//pFile = (CHttpFile*)ss.OpenURL(pCon->strUrl, 1, INTERNET_FLAG_TRANSFER_BINARY|INTERNET_FLAG_DONT_CACHE); if (pFile != NULL)
{
DWORD dwStatus;
//DWORD dwStatusSize = sizeof(DWORD);
//BOOL bOk = pFile->QueryInfo(HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER)
pFile->QueryInfoStatusCode(dwStatus);
if (HTTP_STATUS_OK == dwStatus)
{
while ((nLen = pFile->Read(pCon->buf,)) > )
{
pCon->buf += nLen;
nRead += nLen;
if (nRead >= pCon->bufSize)
{
//Maybe the buffer is too small
break;
}
}
}
ss.Close();
pFile->Close();
delete pFile;
}
}
catch (...)
{
pCon->nRead = ;
} pCon->nRead = nRead;
SetEvent(pCon->hEvent); return ;
} int CSF_HttpDataReader::GetHttpData(CString strUrl,char* buf,int bufSize, int tc /* = 0 */)
{
ASYNC_HTTP_CONTEXT con;
con.strUrl = strUrl;
con.buf = buf;
con.bufSize = bufSize;
con.nRead = ;
con.hEvent = CreateEvent(NULL, FALSE, FALSE, L""); if (tc == )
{
ThreadProc_HttpRead(&con);
}
else
{
CWinThread* thd = AfxBeginThread(ThreadProc_HttpRead, &con);
DWORD dwWait = WaitForSingleObject(con.hEvent, tc*);
if (dwWait == WAIT_TIMEOUT)
{
TerminateThread(thd->m_hThread, );
}
} CloseHandle(con.hEvent); return con.nRead;
}

Timeout方法比较凶狠,容易导致泄露。

HttpReader的更多相关文章

  1. 异构数据源海量数据交换工具-Taobao DataX 下载和使用

    DataX介绍 DataX是一个在异构的数据库/文件系统之间高速交换数据的工具,实现了在任意的数据处理系统(RDBMS/Hdfs/Local filesystem)之间的数据交换. 目前成熟的数据导入 ...

  2. 淘宝异构数据源数据交换工具 DataX

    淘宝异构数据源数据交换工具 DataX 阅读目录 DataX是什么? DataX用来解决什么? DataX特点? DataX结构模式(框架+插件) DataX在淘宝的运用 DataX是什么? Data ...

  3. 大数据 --> 淘宝异构数据源数据交换工具 DataX

    淘宝异构数据源数据交换工具 DataX DataX是什么? DataX是一个在异构的数据库/文件系统之间高速交换数据的工具,实现了在任意的数据处理系统(RDBMS/Hdfs/Local filesys ...

  4. Datax3.0使用说明

    一.datax3.0介绍 1.DataX 是一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL.Oracle等).HDFS.Hive.ODPS.HBase.FTP等各种异构数据源之间稳 ...

  5. 使用Java Socket手撸一个http服务器

    原文连接:使用Java Socket手撸一个http服务器 作为一个java后端,提供http服务可以说是基本技能之一了,但是你真的了解http协议么?你知道知道如何手撸一个http服务器么?tomc ...

  6. 爪哇国新游记之二十九----访问URL获取输入流

    代码: import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWriter; import ...

  7. ETL工具--DataX3.0实战

    DataX是一个在异构的数据库/文件系统之间高速交换数据的工具,实现了在任意的数据处理系统(RDBMS/Hdfs/Local filesystem)之间的数据交换,由淘宝数据平台部门完成. DataX ...

  8. 淘宝上的大智慧L2数据,月卡最便宜是8元钱,这个也可以获取BBD、DDX等数据!

    Want:从顶牛股网上下载DDX数据. 1.下载历史DDE数据:获取最近120个交易日的DDE数据 #define SFURL_DNG_SINGLEL"http://www.dingniug ...

  9. datax二次开发

    从hive抽取数据,写入hbase 一.datax插件hbase12xwriter开发 查看datax源码,发现有hbase094xwriter和hbase11xwriter源码,说明datax支持h ...

随机推荐

  1. Jenkins+maven+gitlab自动化部署之docker发布sprint boot项目(七)

    Jenkins发布docker应用与发布java应用配置基本一致,需要配置Dockerfile及构建的步骤,步骤如下: 1.jenkins主机构建应用为jar包 2.jenkins主机把生产的jar包 ...

  2. java8 : 流

    package day02.com.offcn.test; import java.io.IOException; import java.nio.charset.Charset; import ja ...

  3. Python26之字典2(内置函数)

    一.工厂函数的概念 和序列类型的工厂函数一样,dict()也是一个工厂函数,本质上是一个类,Python程序无处不对象的概念可见一斑 二.字典类型内置函数的用法 1.fromkeys(iterable ...

  4. ActiveMQ 消息队列服务

      1 ActiveMQ简介 1.1 ActiveMQ是什么 ActiveMQ是一个消息队列应用服务器(推送服务器).支持JMS规范. 1.1.1 JMS概述 全称:Java Message Serv ...

  5. 使用querySelector添加移除style和class

    document.querySelector(selector).style.styleName = 样式 对dom节点添加一个样式 document.querySelector(".nam ...

  6. Angular 学习笔记 (Angular 9 & ivy)

    refer : https://blog.angularindepth.com/all-you-need-to-know-about-ivy-the-new-angular-engine-9cde47 ...

  7. Redis缓存如何保证一致性

    为什么使用Redis做缓存 MySQL缺点 单机连接数目有限 对数据进行写速度慢 Redis优点 内存操作数据速度快 IO复用,速度快 单线程模型,避免线程切换带来的开销,速度快 一致性问题 读数据的 ...

  8. javascript获取url参数的方式

     方式一: 推荐使用此方式: url链接为:newsDetail.html?id=8a8080e35f90d9fd015f90dac7750001&modelId=123456 var URL ...

  9. springboot笔记03——quickstart程序原理

    一.前言 一个quickstart程序仅仅让我们初步了解一个框架,我们还需要透过现象看本质才能学好一个框架.所以这篇文章分析一下我上次写的springboot的入门程序. 二.原理分析 1.依赖分析 ...

  10. Android NDK 学习之调用Java函数

    本博客主要是在Ubuntu 下开发,且默认你已经安装了Eclipse,Android SDK, Android NDK, CDT插件. 在Eclipse中添加配置NDK,路径如下Eclipse-> ...