找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1914|回复: 0
打印 上一主题 下一主题
收起左侧

程序练习作品 -> Auto_Update V1.0

[复制链接]
跳转到指定楼层
楼主
ID:71922 发表于 2015-1-11 00:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  为了给用户更好的服务,现在很多软件都提供检查在线升级的功能。
  要实现这个功能,普遍的方法是利用 ftp空间,ftp空间里面存放了信息配置文件以及升级文件。程序一般会从空间上先下载一个存储升级信息的配置文件。通过读取这个配置文件,判断是否要进行程序升级、更新。如果要更新,则会通过配置文件中指定的下载地址去下载升级文件。

例如:ftp 上存放的配置文件如下【Upate.ini】:

[Version]
Version=12
[URL]
URL=http://www.51hei.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);       
        }
}


========================================================================
实验图:








分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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