紫水晶编程技术论坛 - 努力打造成全国最好的编程论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 6264|回复: 3

[原创] Auto_Update V1.0 (喜欢分享自己成果的程序员必备)

[复制链接]

3

主题

21

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

积分
45
发表于 2012-3-11 19:59:42 | 显示全部楼层 |阅读模式
本帖最后由 lovemengx 于 2012-3-11 20:02 编辑

为了给用户更好的服务,现在很多软件都提供检查在线升级的功能。
  要实现这个功能,普遍的方法是利用 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 程序。

1.png

这个程序的功能很简单,就是接受用户的更新信息,回馈升级文件的下载地址。。
我们先添加程序的升级列表再把升级文件上传到网盘里,就会回馈升级文件的网盘下载地址(支持外链的更好,知道的话顺便告诉我一声哈)。
设置服务端的方法:
先去3322 或 花生壳 申请一个免费的动态域名,有路由的朋友先在路由上设置端口映射和自动更新动态域名(路由都具备这些功能)。如果没有路由的朋友直接下载3322 或花生壳的客户端程序,登录后 它会自动指向你的外网ip。  这个目的是为了,让你的程序通过这个域名获取到你的IP。因为ADSL 的IP是会变的。
然后运行Auto_Update V1.0程序,在Auto_Update V1.0 填入你的域名和端口。然后点击【添加/删除】按钮,添加你的升级列表。升级列表里写入你的低版本程序名 相对应的新版本的程序名以及下载地址。这样才能让Auto_Update 才能知道是哪个程序要升级哪个版本以及下载地址是什么。这样就可以准确回馈给相应的用户,不会在多个程序间出现混乱。这个程序支持 260 个不同的程序升级记录。

2.png

你的程序升级模块添加代码方法:
先点击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);
}
}
========================================================================
实验图:
3.png
5.png

0

主题

92

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

积分
166
发表于 2012-3-16 10:46:30 | 显示全部楼层
使用GOOGLE的免费代码空间就行了。。。再加个P2P就完美了

7

主题

421

帖子

1

精华

铂金会员

Rank: 5

积分
2173
发表于 2013-4-10 13:59:04 | 显示全部楼层
這不推不行~~~

30

主题

723

帖子

0

精华

钻石会员

Rank: 6Rank: 6

积分
2815
发表于 2015-5-7 20:24:36 | 显示全部楼层
支持原创 支持分享
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

手机版|Archiver|紫水晶工作室 ( 粤ICP备05020336号 )

GMT+8, 2024-3-29 04:45 , Processed in 0.026941 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表