// WinHttp.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <string>
#include <iostream>
#include <windows.h>
#include <winhttp.h> 
#pragma comment(lib,"winhttp.lib")
#pragma comment(lib,"user32.lib")

BOOL HttpSend(wchar_t* pwszType, wchar_t* pwszIp, wchar_t* pwcsSourcePath, char* pszOutData, int nOutDataLen)
{
DWORD dwSize = 0;
wchar_t* lpHeadBuffer  = NULL;
HINTERNET hSession = NULL;
HINTERNET hConnect = NULL;
HINTERNET hRequest = NULL;
BOOL bResults = FALSE;
BOOL bUTF8Code = TRUE;

hSession=WinHttpOpen(L"User Agent",WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,WINHTTP_NO_PROXY_NAME,WINHTTP_NO_PROXY_BYPASS,0);
if(hSession)
{
hConnect=WinHttpConnect(hSession, pwszIp,INTERNET_DEFAULT_HTTP_PORT,0);
}
if(hConnect)
{
hRequest=WinHttpOpenRequest(hConnect, pwszType, pwcsSourcePath,L"HTTP/1.1", WINHTTP_NO_REFERER,WINHTTP_DEFAULT_ACCEPT_TYPES,0);
}
if(hRequest)
{
bResults=WinHttpSendRequest(hRequest,WINHTTP_NO_ADDITIONAL_HEADERS, 0,WINHTTP_NO_REQUEST_DATA, 0, 0, 0 );
}
if(bResults)
{
bResults=WinHttpReceiveResponse(hRequest,NULL);
}
if(bResults)
{
bResults=WinHttpQueryHeaders(hRequest,WINHTTP_QUERY_RAW_HEADERS_CRLF, WINHTTP_HEADER_NAME_BY_INDEX,NULL,&dwSize,WINHTTP_NO_HEADER_INDEX);
if( GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
lpHeadBuffer = new wchar_t[dwSize/sizeof(wchar_t)];
bResults = WinHttpQueryHeaders(hRequest,WINHTTP_QUERY_RAW_HEADERS_CRLF,WINHTTP_HEADER_NAME_BY_INDEX, lpHeadBuffer, &dwSize,WINHTTP_NO_HEADER_INDEX);
}
if ( NULL != wcsstr(lpHeadBuffer, L"charset=gbk") )
{
bUTF8Code = FALSE;
}
}
delete [] lpHeadBuffer;

BOOL bFirstRead = TRUE;
LPVOID lpOutBuffer = NULL;
LPSTR pszOutBuffer = NULL;
DWORD dwDownloaded = 0;
int nSize = 0;
if(bResults)
{
do
{
// Check for available data.
dwSize = 0;
if ( !WinHttpQueryDataAvailable( hRequest, &dwSize) )
{
break;
}
if ( TRUE == bFirstRead && 0 == dwSize )
{
bResults = FALSE;
break;
}
else if ( 0 == dwSize )
{
break;
}
bFirstRead = FALSE;

pszOutBuffer = new char[dwSize+1];
if (!pszOutBuffer)
{
bResults = FALSE;
break;
}
ZeroMemory(pszOutBuffer, dwSize+1);

if ( !WinHttpReadData(hRequest,(LPVOID)pszOutBuffer, dwSize, &dwDownloaded) || (0 == dwDownloaded) )
{
delete [] pszOutBuffer;
break;
}
if ( FALSE == bUTF8Code )
{
// 转成UTF-8
int len = MultiByteToWideChar(CP_ACP, 0, pszOutBuffer, -1, NULL, 0);
wchar_t* pwszUnicode = new wchar_t[len];
memset(pwszUnicode, 0, sizeof(pwszUnicode));
MultiByteToWideChar(CP_ACP, 0, pszOutBuffer, -1, pwszUnicode, len);
int len2 = WideCharToMultiByte(CP_UTF8, 0, pwszUnicode, len, NULL, 0, NULL, NULL);
nSize += len2;
if ( nOutDataLen < nSize )
{
bResults = FALSE;
break;
}
WideCharToMultiByte(CP_UTF8, 0, pwszUnicode,len, pszOutData+strlen(pszOutData)
, nOutDataLen-strlen(pszOutData), NULL, NULL);
}
else
{
if ( nOutDataLen < dwSize )
{
bResults = FALSE;
break;
}
strcpy_s(pszOutData, nOutDataLen, pszOutBuffer);
}
delete [] pszOutBuffer;

} while (dwSize > 0);
}
if (hRequest) WinHttpCloseHandle(hRequest);
if (hConnect) WinHttpCloseHandle(hConnect);
if (hSession) WinHttpCloseHandle(hSession);

return bResults;
}

int _tmain(int argc, _TCHAR* argv[])
{
BOOL bRet = FALSE;
char szOutData[0x1000] = {0};
bRet = HttpSend(L"GET", L"ip.taobao.com", L"/service/getIpInfo.php?ip=124.207.113.2", szOutData, sizeof(szOutData));
if ( !bRet )
{
return 0;
}
memset(szOutData, 0, sizeof(szOutData));
bRet = HttpSend(L"POST", L"pv.sohu.com", L"/cityjson", szOutData, sizeof(szOutData));
system("pause");
return 0;

}

参考网址:http://www.cnblogs.com/ytjjyy/archive/2012/05/05/2484844.html

WinHttp的简单使用用例相关推荐

  1. PROC简单使用用例--VC连接ORACLE

    操作系统:windows 7 数据库版本:oracle 10g VS版本:VS2010 前言:连接ORACLE的方式有很多,此处仅以PROC为例,说明如何连接oracle,有不妥之处,望诸位看官指出, ...

  2. UML建模-如何使用用例获取需求

    简介: 开发都通常都使用典型场景(scenarios)来理解一个系统的需要是什么和系统是怎样工作的.不幸的是,尽管开发都已经这样做了,但它极少用有效的形式归档.用例(Use Cases)就是将这些场景 ...

  3. 软件开发质量的双保险 — 3.应用设计验证与应用用例

    设计验证的第二层是检验应用设计的质量.应用设计的检验是对软件"好用"的保证,它解决了如何用信息化手段提升客户的工作效率. 应用设计验证重点包括:业务设计的结果在系统中的落地是否顺利 ...

  4. R语言dataframe(data.table)使用用最近的前一个非NA值向前填充缺失值NA实战

    R语言dataframe(data.table)使用用最近的前一个非NA值向前填充缺失值NA实战 目录 R语言dataframe(data.tabl

  5. DELPHI 指针使用用的一篇好文 收藏

    DELPHI 指针使用用的一篇好文 收藏     Delphi里自己管理内存的两对函数 new(),dispose()和getmem(),freemem() 大家都认为,C语言之所以强大,以及其自由性 ...

  6. JBoss 系列九十六:JBoss MSC - 简介及一个简单演示样例

    什么是 JBoss MSC JBoss MSC 即 JBoss Modular Service Container,是第三代 JBoss 产品 JBoss 7和WildFfly的内核,JBoss MS ...

  7. [Android开源]一个非常简单易用用来花式展示二维码样式生成的库QRCodeStyle

    类库说明 一个非常简单易用用来花式展示二维码样式生成的库 自由组合二维码样式 使用范例 设置带圆边圈的logo Bitmap logo = BitmapFactory.decodeResource(g ...

  8. ElasticSearch(7.2.2)-搜索的简单使⽤

    搜索的简单使⽤ 准备⼯作 删掉nba索引 DELETE localhost:9200/nba 新建⼀个索引,并且指定mapping PUT localhost:9200/nba {"mapp ...

  9. wind金融数据接口python_python使用用Wind接口获取全部A股历史交易数据

    python使用用Wind接口获取全部A股历史交易数据 2018-11-29 果然是中文编码的问题.搞定了,新鲜出炉一个小脚本.谢谢各位大神的解答. """ @Autho ...

最新文章

  1. httpd基于域名不同的虚拟主机配置
  2. 超图三维服务学习摘要1
  3. 【Linux】39.nslookup查看域名与其对应的ip
  4. 反思快乐:融入 真实 不回忆 聪明应对
  5. 计算机常用控温算法,常用温度控制方法原理 -解决方案-华强电子网
  6. Linux 网卡驱动学习(二)(网络驱动接口小结)
  7. 盘点Mac最受欢迎的优化清理软件2020|最新|集合|排行榜
  8. 文件图片随机划分训练集和验证集
  9. 钢构件建筑材料英国UKCA认证—EN 13381-4
  10. 2063【例1.4】牛吃牧草-c++语言入门
  11. 基于QT的网络五子棋游戏程序的设计与实现
  12. 产品必备-用户故事模板
  13. 计算机cpu天体图,台式电脑CPU天梯图2019年1月版更新 多款新九代酷睿处理器了解下...
  14. ios13 微信提示音插件_iOS 13 替换微信提示音(教程),简单操作
  15. QT 利用QAxObject大数据读写excel文件
  16. 二叉树的结构特点及性质
  17. HashMap源码分析(深入理解HashMap)
  18. 产品定位的方法与案例,遵循 大而全不如小而精 理念
  19. 【项目】数仓项目(八)
  20. 流媒体学习-WebRTC全面入门学习-1

热门文章

  1. 计算机科学与技术论文提纲,学分有关论文范例,与计算机科学与技术系相关毕业论文提纲范文...
  2. 本科生如何入门GNSS算法(二)- rtklib定位解算过程中的GNSS数据格式以及基本概念
  3. Kotlin学习(3):习惯用法
  4. Oracle PL/SQL 源代码加密实战
  5. C语言求解距多个点最短长度,算法设计技巧与分析课后习题答案沙特
  6. R语言获取GEO表达数据
  7. 启用 DHCP 和静态 IP 共存
  8. 2021年全国职业院校技能大赛(中职组)网络安全竞赛试题(1)详细解析教程
  9. 一道和稀饭绝配的自制腌菜
  10. python通过Tkinter库实现的一个简单的文本编辑器源码