|
為了給用戶更好的服務(wù),現(xiàn)在很多軟件都提供檢查在線升級(jí)的功能。
要實(shí)現(xiàn)這個(gè)功能,普遍的方法是利用 ftp空間,ftp空間里面存放了信息配置文件以及升級(jí)文件。程序一般會(huì)從空間上先下載一個(gè)存儲(chǔ)升級(jí)信息的配置文件。通過(guò)讀取這個(gè)配置文件,判斷是否要進(jìn)行程序升級(jí)、更新。如果要更新,則會(huì)通過(guò)配置文件中指定的下載地址去下載升級(jí)文件。
例如:ftp 上存放的配置文件如下【Upate.ini】:
[Version]
Version=12
[URL]
URL=http://www.zg4o1577.cn/123.exe
那么程序會(huì)先下載 Upate.ini 文件,然后將自己的版本號(hào)與配置文件中的 Version 對(duì)比,如果是這個(gè)版本號(hào),說(shuō)明沒(méi)有更新。如果比它小,則說(shuō)明需要更新,讀取URP 下載地址,進(jìn)行下載升級(jí)文件。
如果我們有更新了程序,版本為 13, 則可以修改配置文件,再上傳到 ftp 空間上。程序就能自動(dòng)檢測(cè)到文件更新了。
上面介紹的這種方式,比較通用適合免費(fèi)的FTP空間。
還有一種方式,使用匿名FTP在程序里獲取版本信息文件。不必下載配置文件。不過(guò)不適合免費(fèi)的FTP空間。但是免費(fèi)的FTP空間不太安全。我就遇到過(guò)空間被不定時(shí)無(wú)故關(guān)閉,官方稱提供免費(fèi)的服務(wù)器訪問(wèn)量太大暫時(shí)關(guān)閉部分空間緩解壓力。建議我升級(jí)付費(fèi)空間就不存在此問(wèn)題。還有一個(gè)問(wèn)題就是自己的靜態(tài)網(wǎng)站上被掛馬了!我靠!靜態(tài)網(wǎng)站總不可能被注入什么的吧?
如果自己搭建FTP空間也行,但是考慮到 ADSL 的上下行不對(duì)稱。我不建議這樣做。
前面說(shuō)了一大堆都是說(shuō)更新的方法,免費(fèi)FTP空間不安全,如果為了一些練習(xí)作品去購(gòu)買(mǎi)付費(fèi)空間貌似又不太值。那怎么辦呢?我之前就一直糾結(jié)這個(gè)問(wèn)題。
如今突然有靈感了,在不需要購(gòu)買(mǎi)付費(fèi)的FTP空間或不使用不安全的免費(fèi)FTP空間的前提下設(shè)計(jì)了這個(gè) Auto_Update V1.0 程序。

這個(gè)程序的功能很簡(jiǎn)單,就是接受用戶的更新信息,回饋升級(jí)文件的下載地址。。
我們先添加程序的升級(jí)列表再把升級(jí)文件上傳到網(wǎng)盤(pán)里,就會(huì)回饋升級(jí)文件的網(wǎng)盤(pán)下載地址(支持外鏈的更好,知道的話順便告訴我一聲哈)。
設(shè)置服務(wù)端的方法:
先去3322 或 花生殼 申請(qǐng)一個(gè)免費(fèi)的動(dòng)態(tài)域名,有路由的朋友先在路由上設(shè)置端口映射和自動(dòng)更新動(dòng)態(tài)域名(路由都具備這些功能)。如果沒(méi)有路由的朋友直接下載3322 或花生殼的客戶端程序,登錄后 它會(huì)自動(dòng)指向你的外網(wǎng)ip。 這個(gè)目的是為了,讓你的程序通過(guò)這個(gè)域名獲取到你的IP。因?yàn)锳DSL 的IP是會(huì)變的。
然后運(yùn)行Auto_Update V1.0程序,在Auto_Update V1.0 填入你的域名和端口。然后點(diǎn)擊【添加/刪除】按鈕,添加你的升級(jí)列表。升級(jí)列表里寫(xiě)入你的低版本程序名 相對(duì)應(yīng)的新版本的程序名以及下載地址。這樣才能讓Auto_Update 才能知道是哪個(gè)程序要升級(jí)哪個(gè)版本以及下載地址是什么。這樣就可以準(zhǔn)確回饋給相應(yīng)的用戶,不會(huì)在多個(gè)程序間出現(xiàn)混亂。這個(gè)程序支持 260 個(gè)不同的程序升級(jí)記錄。

你的程序升級(jí)模塊添加代碼方法:
先點(diǎn)擊Auto_Update V1.0 上的【生成文件】按鈕,Auto_Update V1.0 會(huì)在自身目錄下生成一個(gè) AutoUpdateClient.h 頭文件和 TestUpdate.cpp 例程文件
AutoUpdateClient.h:提供了一個(gè) 核心的AutoUpade()函數(shù)接口。用來(lái)連接 Auto_Update V1.0 獲得升級(jí)信息。具體使用方法可以看看頭文件里面的注釋。
TestUpdate.cpp:是一個(gè)調(diào)用例程。
TestUpdate.cpp:
=================================================================
// 升級(jí)必須要的頭文件和鏈接庫(kù)
#include <WINSOCK2.H>
#pragma comment(lib,"ws2_32.lib")
#include <windows.h>
#include <stdio.h>
// 升級(jí)函數(shù)
#include "AutoUpdateClient.h"
/************************************************************************
* 參數(shù):模式 0:實(shí)時(shí)檢查 1:檢查一次
/************************************************************************/
void Updatee(int MS)
{
// 服務(wù)器域名地址
char HostNmane[] = "lovemengx.vicp.net";
// 發(fā)送自身版本信息及接受新版本的信息
char Rname[MAX_PATH] = "TestUpdate V1.0";
// 接受下載地址
char Download[MAX_PATH] = {0};
// 臨時(shí)緩沖區(qū)
char Temp[MAX_PATH] = {0};
// 服務(wù)器端口
int Port = 1230 ;
while(1)
{
// 返回 0 則表示 檢測(cè)到新版本
if (!AutoUpade(HostNmane, Port ,Rname,Download))
{
sprintf(Temp, "程序檢測(cè)到最新版本:%s\t\n\n下載地址是:%s\t", Rname, Download);
if (IDYES == ::MessageBox(0,Temp , "檢測(cè)到新版本程序~~", MB_YESNO | MB_ICONQUESTION | MB_SYSTEMMODAL))
{
ShellExecute(NULL, "open", Download, NULL, NULL, SW_SHOWNORMAL);
}
else
{
exit(0);
}
}
// 如果模式是 非實(shí)時(shí)檢查則跳出循環(huán)結(jié)束檢查
if(MS)
break;
}
}
/************************************************************************/
/* 一個(gè)實(shí)時(shí)檢查升級(jí)的例子 */
/************************************************************************/
void SSJC()
{
puts("**************************************************************");
puts("這是個(gè)實(shí)時(shí)檢查自動(dòng)升級(jí)的例子...");
puts("你可以根據(jù)自己所需修改...");
puts("**************************************************************");
puts("已經(jīng)啟動(dòng)實(shí)時(shí)檢查升級(jí)...");
CreateThread(0,0,(LPTHREAD_START_ROUTINE)Updatee,0,0,0);
}
/************************************************************************/
/* 一個(gè)啟動(dòng)立即檢查升級(jí)的例子 */
/************************************************************************/
void YUpate()
{
puts("**************************************************************");
puts("這是個(gè)啟動(dòng)時(shí)檢查升級(jí)的例子...");
puts("**************************************************************");
puts("已經(jīng)啟動(dòng)檢查升級(jí)...");
Updatee(1);
}
void main()
{
int i=0;
puts("***************************************************************");
puts(" 1:?jiǎn)?dòng)時(shí)檢查一次升級(jí)例子");
puts(" 2:實(shí)時(shí)檢查升級(jí)例子");
puts("");
puts("【兩個(gè)例子都調(diào)用了 AutoUpade() 這個(gè)函數(shù)來(lái)獲取服務(wù)器的升級(jí)信息】");
puts("***************************************************************");
puts("請(qǐng)選擇:");
scanf("%d", &i);
if (i == 1)
{
puts("你選擇了【啟動(dòng)時(shí)檢查一次升級(jí)例子】");
YUpate();
}
else
{
puts("你選擇了【實(shí)時(shí)檢查升級(jí)例子】");
SSJC();
Sleep(1000000);
}
}
========================================================================
實(shí)驗(yàn)圖:


|
|