|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 Love 梦想 于 2012-3-11 15:43 编辑
为了给用户更好的服务,现在很多软件都提供检查在线升级的功能。
要实现这个功能,普遍的方法是利用 ftp空间,ftp空间里面存放了信息配置文件以及升级文件。程序一般会从空间上先下载一个存储升级信息的配置文件。通过读取这个配置文件,判断是否要进行程序升级、更新。如果要更新,则会通过配置文件中指定的下载地址去下载升级文件。
例如:ftp 上存放的配置文件如下【Upate.ini】:
[Version]
Version=12
URL=http://www.123.com/123.exe
那么程序会先下载 Upate.ini 文件,然后将自己的版本号与配置文件中的 Version 对比,如果是这个版本号,说明没有更新。如果比它小,则说明需要更新,读取URP 下载地址,进行下载升级文件。
如果我们有更新了程序,版本为 13, 则可以修改配置文件,再上传到 ftp 空间上。程序就能自动检测到文件更新了。
上面介绍的这种方式,比较通用适合免费的FTP空间。
还有一种方式,使用匿名FTP在程序里获取版本信息文件。不必下载配置文件。不过不适合免费的FTP空间。但是免费的FTP空间不太安全。我就遇到过空间被不定时无故关闭,官方称提供免费的服务器访问量太大暂时关闭部分空间缓解压力。建议我升级付费空间就不存在此问题。还有一个问题就是自己的静态网站上被挂马了!我靠!静态网站总不可能被注入什么的吧?
如果自己搭建FTP空间也行,但是考虑到 ADSL 的上下行不对称。我不建议这样做。
前面说了一大堆都是说更新的方法,免费FTP空间不安全,如果为了一些练习作品去购买付费空间貌似又不太值。那怎么办呢?我之前就一直纠结这个问题。
如今突然有灵感了,在不需要购买付费的FTP空间或不使用不安全的免费FTP空间的前提下设计了这个 Auto_Update V1.0 程序。
这个程序的功能很简单,就是接受用户的更新信息,回馈升级文件的下载地址。。
我们先添加程序的升级列表再把升级文件上传到网盘里,就会回馈升级文件的网盘下载地址(支持外链的更好,知道的话顺便告诉我一声哈)。
设置服务端的方法:
先去3322 或 花生壳 申请一个免费的动态域名,有路由的朋友先在路由上设置端口映射和自动更新动态域名(路由都具备这些功能)。如果没有路由的朋友直接下载3322 或花生壳的客户端程序,登录后 它会自动指向你的外网ip。 这个目的是为了,让你的程序通过这个域名获取到你的IP。因为ADSL 的IP是会变的。
然后运行Auto_Update V1.0程序,在Auto_Update V1.0 填入你的域名和端口。然后点击【添加/删除】按钮,添加你的升级列表。升级列表里写入你的低版本程序名 相对应的新版本的程序名以及下载地址。这样才能让Auto_Update 才能知道是哪个程序要升级哪个版本以及下载地址是什么。这样就可以准确回馈给相应的用户,不会在多个程序间出现混乱。这个程序支持 260 个不同的程序升级记录。
你的程序升级模块添加代码方法:
先点击Auto_Update V1.0 上的【生成文件】按钮,Auto_Update V1.0 会在自身目录下生成一个 AutoUpdateClient.h 头文件和 TestUpdate.cpp 例程文件
AutoUpdateClient.h:提供了一个 核心的AutoUpade()函数接口。用来连接 Auto_Update V1.0 获得升级信息。具体使用方法可以看看头文件里面的注释。
TestUpdate.cpp:是一个调用例程。
TestUpdate.cpp:
=================================================================
// 升级必须要的头文件和链接库
#include <WINSOCK2.H>
#pragma comment(lib,"ws2_32.lib")
#include <windows.h>
#include <stdio.h>
// 升级函数
#include "AutoUpdateClient.h"
/************************************************************************
* 参数:模式 0:实时检查 1:检查一次
/************************************************************************/
void Updatee(int MS)
{
// 服务器域名地址
char HostNmane[]= "lovemengx.vicp.net";
// 发送自身版本信息及接受新版本的信息
char Rname[MAX_PATH]= "TestUpdate V1.0";
// 接受下载地址
char Download[MAX_PATH]= {0};
// 临时缓冲区
char Temp[MAX_PATH]= {0};
// 服务器端口
int Port = 1230;
while(1)
{
//返回 0 则表示 检测到新版本
if (!AutoUpade(HostNmane, Port ,Rname,Download))
{
sprintf(Temp, "程序检测到最新版本:%s\t\n\n下载地址是:%s\t", Rname, Download);
if (IDYES == ::MessageBox(0,Temp , "检测到新版本程序~~", MB_YESNO | MB_ICONQUESTION | MB_SYSTEMMODAL))
{
ShellExecute(NULL, "open", Download, NULL, NULL, SW_SHOWNORMAL);
}
else
{
exit(0);
}
}
// 如果模式是 非实时检查则跳出循环结束检查
if(MS)
break;
}
}
/************************************************************************/
/* 一个实时检查升级的例子 */
/************************************************************************/
void SSJC()
{
puts("**************************************************************");
puts("这是个实时检查自动升级的例子...");
puts("你可以根据自己所需修改...");
puts("**************************************************************");
puts("已经启动实时检查升级...");
CreateThread(0,0,(LPTHREAD_START_ROUTINE)Updatee,0,0,0);
}
/************************************************************************/
/* 一个启动立即检查升级的例子 */
/************************************************************************/
void YUpate()
{
puts("**************************************************************");
puts("这是个启动时检查升级的例子...");
puts("**************************************************************");
puts("已经启动检查升级...");
Updatee(1);
}
void main()
{
int i=0;
puts("***************************************************************");
puts(" 1:启动时检查一次升级例子");
puts(" 2:实时检查升级例子");
puts("");
puts("【两个例子都调用了 AutoUpade() 这个函数来获取服务器的升级信息】");
puts("***************************************************************");
puts("请选择:");
scanf("%d", &i);
if (i == 1)
{
puts("你选择了【启动时检查一次升级例子】");
YUpate();
}
else
{
puts("你选择了【实时检查升级例子】");
SSJC();
Sleep(1000000);
}
}
========================================================================
实验图:
下载附件 (233.64 KB)[size=0.83em]7 分钟前 上传
程序下载地址:
|
|