头文件:

#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. Ubuntu12.10添加matlab启动器

    首先我们要了解,Ubuntu 的 Dash 里所有程序都是在 /usr/share/applications 中的,所以我们的思路很简单——建一个类似于“快捷方式”一样的东西扔进去就好了. 1. 终端 ...

  2. 介绍几款常用的在线API管理工具

    在项目开发过程中,总会涉及到接口文档的设计编写,之前使用的都是ms office工具,不够漂亮也不直观,变更频繁的话维护成本也更高,及时性也是大问题.基于这个背景,下面介绍几个常用的API管理工具,方 ...

  3. STL源码剖析——iterators与trait编程#4 iterator源码

    在前两节介绍了迭代器的五个相应类型,并讲述如何利用traits机制提取迭代器的类型,但始终是把iteartor_traits类分割开来讨论,这影响我们的理解,本节将给出iteator的部分源码,里面涵 ...

  4. 长乐培训Day7

    T1 删除 题目 [题目描述] 现在,我的手上有 n 个数字,分别是 a1,a2,a3,...,an. 我现在需要删除其中的 k 个数字.当然我不希望随随便便删除,我希望删除 k 数字之后,剩下的 n ...

  5. C语言处理字符串

    1. strtok 函数原型: char * strtok(char *str, const char * delim); 注意点: 两个入参必须为字符串数组: 第一次调用要传str, delim,后 ...

  6. docker 实践八:docker-compose

    本篇介绍 docker 官方三剑客之一的 docker-compose. 注:环境为 CentOS7,docker 19.03. docker-compose docker-compose 的前身是开 ...

  7. 使用 react 的 hooks 进行全局的状态管理

    使用 react 的 hooks 进行全局的状态管理 React 最新正式版已经支持了 Hooks API,先快速过一下新的 API 和大概的用法. // useState,简单粗暴,setState ...

  8. MySQL库的相关操作

    再熟悉一下Mysql库.表.记录的基本操作. 库 增 create database userinfo1 charset utf8; 查 show databases; show create dat ...

  9. 【转载】Asp.Net MVC网站提交富文本HTML标签内容抛出异常

    今天开发一个ASP.NET MVC网站时,有个页面使用到了FCKEditor富文本编辑器,通过Post方式提交内容时候抛出异常,仔细分析后得出应该是服务器阻止了带有HTML标签内容的提交操作,ASP. ...

  10. echarts字体适配

    var html = document.getElementsByTagName("html")[0]; var width = html.clientWidth; var too ...