C++服务器下载文件的两种方式
#include <afxinet.h>
#include "wininet.h"
#pragma comment( lib, "wininet.lib" ) string remoteIP = "http://www.test.com:8001";
string testIP = getDomain("IP");
string testPort = getDomain("PORT");
if (testIP != "NULL" && testPort != "NULL")
{
remoteIP = "http://" + testIP + ":"+ testPort;
}
logs.addLog("当前IP", remoteIP);
string finalURL = remoteIP + "/autoupdater.xml";
Divice_info dinfo;
finalURL += "?bit=";
finalURL += dinfo.getSystemByte().c_str();
finalURL += "&mem=";
finalURL += dinfo.getMem_info().c_str();
finalURL += "&disk=";
finalURL += dinfo.getDisk_info().c_str();
finalURL += "&os=";
finalURL += dinfo.getOSVersion_info().c_str();
finalURL += "&sys=";
finalURL += dinfo.getSystem_info().c_str();
finalURL += "&fingerprint=";
finalURL += m_fingerprint;
finalURL += "&version=";
TinyXmlConfig *txc = new TinyXmlConfig();
string version;
string configxml = m_workdirection + "\\config\\config.xml";
BOOL check = txc->getAttribute(configxml,"version", version);
if (FALSE == check)
{
version = "0.0.0.0";
}
finalURL += version;
finalURL += "&protocol=0";//twain logs.addLog(finalURL);
try {
//写入本地xml
string tempxml = m_workdirection + "\\config\\temp.xml";
/*
//从服务器获取xml文件
HINTERNET hOpen = InternetOpen("RookIE/1.0", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if (hOpen == NULL)
{
logs.addLog("isUpdate() Internet Open fail...");
return FALSE;
}
HINTERNET hUrl = InternetOpenUrl(hOpen, finalURL.c_str(), NULL, 0, INTERNET_FLAG_DONT_CACHE, 0);
if (hUrl == NULL)
{
logs.addLog("isUpdate() Internet OpenUrl fail...");
InternetCloseHandle(hOpen);
return FALSE;
}
char buffer[10240];
DWORD readByte = 0;
DWORD writeByte = 0;
BOOL hread, hwrite;
buffer[readByte] = '\0'; HANDLE createfile;
createfile = CreateFile(tempxml.c_str(), GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if (createfile == INVALID_HANDLE_VALUE)
{
logs.addLog("isUpdate() Create temp.xml failed!");
return FALSE;
}
int flag = 0;
while (true)
{
hread = InternetReadFile(hUrl, buffer, sizeof(buffer), &readByte);
if (hread == FALSE)
{
logs.addLog("isUpdate() hUrl read buffer fail...");
flag++;
break;
}
if (readByte == 0)
{
logs.addLog("isUpdate() temp.xml writeed successful...");
break;
}
hwrite = WriteFile(createfile, buffer, readByte, &writeByte, NULL);
if (hwrite == FALSE)
{
flag++;
logs.addLog("isUpdate() temp.xml write buffer fail...");
break;
}
}
CloseHandle(createfile);
InternetCloseHandle(hOpen);
InternetCloseHandle(hUrl);
*/
//if (flag>0)
//return FALSE;
bool flag = false;
HRESULT urldown = URLDownloadToFile(NULL,finalURL.c_str(), tempxml.c_str(),,NULL);
if (E_OUTOFMEMORY == urldown)
{
logs.addLog("server url xml is download fail");
}
else if (S_OK == urldown)
{
flag = true;
logs.addLog("server url xml is dowload successful");
}
else if (INET_E_DOWNLOAD_FAILURE == urldown)
{
logs.addLog("server url xml is not exist");
}
logs.addLog("server url xml返回值HREDULT",to_string(urldown));
if (flag)
{
string value;
BOOL hr = txc->getAttribute(tempxml, "NeedUpdate", value);
BOOL h1 = txc->getAttribute(tempxml, "url", m_urlZip);
BOOL h2 = txc->getAttribute(tempxml, "lastver", m_lastVersion);
BOOL h3 = txc->getAttribute(tempxml, "md5", m_md5);
BOOL h4 = txc->getAttribute(tempxml, "size", m_filesize);
delete txc;
if (FALSE == h1 || FALSE == h2 || FALSE == h3 || FALSE == h4)
{
logs.addLog("isUpdate() temp.xml url or lastver or md5 or get size get fail...");
return FALSE;
}
if (hr == TRUE)
{
logs.addLog("isUpdate() NeedUpdate : ", value);
if (_stricmp(value.c_str(), "true") == )
{
logs.addLog("isUpdate() NeedUpdate's value is True");
return TRUE;
}
else {
logs.addLog("isUpdate() NeedUpdate' value is Flase");
return FALSE;
}
}
else {
logs.addLog("isUpdate() temp.xml getAttribute fail..");
return FALSE;
}
}
}
catch (exception e)
{
logs.addLog("isUpdate() Exception");
return FALSE;
}
C++服务器下载文件的两种方式的更多相关文章
- java 下载文件的两种方式和java文件的上传
一:以网络的方式下载文件 try { // path是指欲下载的文件的路径. File file = new File(path); // 以流的形式下载文件. InputStream fis = n ...
- C#从服务器下载文件的四种方式
//方法一:TransmitFile实现下载 string fileName = "ss.docx"; //客户端预设的文件名,导出时可修改 string filePath = ...
- jsp:jsp包含文件的两种方式
第一种:include指令 include指令:当JSP转换成Servlet时引入指定文件(指令元素),这是一种静态包含,它运行的时候不会单独编译成.class文件,它生成一个新的整体.class文件 ...
- Eclipse项目中引用第三方jar包时将项目打包成jar文件的两种方式
转载自:http://www.cnblogs.com/lanxuezaipiao/p/3291641.html 方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 “MANIFES ...
- 加载xib文件的两种方式
一.加载xib文件的两种方式 1.方法一(NewsCell是xib文件的名称) NSArray *objects = [[NSBundle mainBundle] loadNibNamed:@&quo ...
- js 图片base64转file文件的两种方式
js 图片base64转file文件的两种方式 https://blog.csdn.net/yin13037173186/article/details/83302628 //将base64转换为bl ...
- 从后端接口下载文件的2种方式:get方式、post方式
从后端接口下载文件的2种方式 一.get方式 直接使用: location.href='http://www.xxx.com/getFile?params1=xxx¶ms2=xxxx' ...
- 【文件下载】Java下载文件的几种方式
[文件下载]Java下载文件的几种方式 摘自:https://www.cnblogs.com/sunny3096/p/8204291.html 1.以流的方式下载. public HttpServl ...
- Springboot 创建的maven获取resource资源下的文件的两种方式
Springboot 创建的maven项目 打包后获取resource下的资源文件的两种方式: 资源目录: resources/config/wordFileXml/wordFileRecord.xm ...
随机推荐
- Java ThreadLocal的使用
Java中的ThreadLocal类允许我们创建只能被同一个线程读写的变量.因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个线程同时执行这段代码,它们也无法访问到对方的Thread ...
- Revit中如何给不同构件着色
在Revit构件密集,默认的显示模式难以区分不同构件的区别,比如建筑立面有很多不同的机电管道,风管.水管,电缆桥架等,可一个给不同的机电管线添加不同的颜色,以示其区别,如下图所示,完成着色后,各种不同 ...
- Linux 中C/C++ search path(头文件搜索路径)
https://blog.csdn.net/BjarneCpp/article/details/76135980 起因 我拿到了一套Linux下的C++代码,代码中有这个头文件#include < ...
- 【T01】理解面向连接和无连接协议之间的区别
1.面向连接和无连接指的是协议,本质区别在于:对于无连接协议来说,每个分组的处理都独立于其他的分组. 而对于面向连接的协议,协议实现维护了当前分组与后继分组有关的状态信息. 2.无连接就是指udp,分 ...
- 〖Java〗Eclispe安装和使用viplugin
习惯了VIM的操作,每次打开Eclipse都习惯性的按下 hjkl: 感觉蛋疼了使用一下VIPlugin,发现给编码速度造成了成吨的伤害- 这个插件对于习惯于使用VIM的程序员来说,简直太有必要了.. ...
- pycharm修改快捷键
1.keymap 2.找到需要修改的功能 3.鼠标右键选择——选择“add keyboard shortcut” 4.直接按需要设置的快捷键位,如F6 5.确定
- gcc下inline的一个问题
今天发现一个问题,与inline有关,也与编译时候是不是优化有关. 大概问题可以用下面的代码来描述: 先写一个libtest1,代码如下 libtest1.h #ifndef LIBTEST_H #d ...
- [Python]编码声明:是coding:utf-8还是coding=urf-8呢
推荐: #!/usr/bin/env python3 # -*- coding: utf-8 -*- 我们知道在Python源码的头文件中要声明编码方式,如果你不只是会用到ascii码,很多人都写得都 ...
- STL--迭代器(iterator)使用详解
迭代器的分类 在STL中,原生指针也是一种迭代器,除了原生指针以外,迭代器被分为五类: Input Iterator 此迭代器不允许修改所指的对象,即是只读的.支持==.!=.++.*.->等操 ...
- 【Android】详解Android 网络操作
目录结构: contents structure [+] 判断网络 判断是否有网络连接 判断WIFI网络是否可用 判断MOBILE网络是否可用 获取当前网络连接的类型信息 监听网络 获取网络信息需要在 ...