• 沒有找到結果。

第六章 結論

B.3 Network

Server 提供 client 連線下載更新資料,以及上傳使用記錄以便日後做 data mining 用

主程式

//開啟 server socket

server_sockfd = socket(AF_INET, SOCK_STREAM, 0);

server_address.sin_family = AF_INET;

server_address.sin_addr.s_addr = htonl(INADDR_ANY);

server_address.sin_port = htons(PORT_NUM);

server_len = sizeof(server_address);

bind(server_sockfd, (struct sockaddr *)&server_address, server_len);

//設定最大連線數目 listen(server_sockfd, 5);

signal(SIGCHLD, SIG_IGN);

while(1) {

//接受 client 連線

client_len = sizeof(client_address);

client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len);

//產生一 process 處理該 client 連線 if(fork() == 0)

{

//確認使用者

read(client_sockfd, &id, sizeof(id));

write(client_sockfd, &id, sizeof(id));

read(client_sockfd, &ok, 1);

if(ok == 'Y') {

//根據 client 命令提供上傳或是下載檔案服務 while(read(client_sockfd, &comd, sizeof( comd ) ) ) {

if(strcmp("DL", comd) == 0) {

//下載

fileDLTrans(client_sockfd);

}

else if(strcmp("UL", comd) == 0) {

//上傳

fileULTrans(client_sockfd);

}

else if(strcmp("DC", comd) == 0) {

//中斷連線

close(client_sockfd);

break;

exit(1);

}

strcpy(comd, "");

}

void fileDLTrans(int client_sockfd) {

FILE *fp;

int readbyte,count=0;

char filename[50];

char filetmp[50] = "/var/www/html/update/upd/";

char lastupdtime[11];

char command[70] = "php /var/www/html/update/update.php ";

char fok = 'Y';

char fnotok = 'N';

char buf[MAX_BUFFER_SIZE];

//取得上次更新日期

read(client_sockfd, &lastupdtime, sizeof(lastupdtime));

//取得更新檔名(使用者代碼)

read(client_sockfd, &filename, sizeof(filename));

//準備 php 指令,用來產生下載檔案 strcat(command, lastupdtime);

strcat(command, " ");

strcat(command, filename);

//產生下載檔案 system(command);

//下載檔案

strcat(filename, ".txt");

strcat(filetmp, filename);

strcpy(filename, filetmp);

fp = fopen(filename,"rb");

if(fp == NULL) {

write(client_sockfd, &fnotok, sizeof(fnotok) );

return;

} else

write(client_sockfd, &fok, sizeof(fok) );

while((readbyte = fgetc(fp)) != EOF) {

buf[count] = (char)readbyte;

count++;

}

fclose(fp);

write(client_sockfd, &buf, count);

}

上傳檔案服務程式

void fileULTrans(int client_sockfd) {

FILE *fp;

int readbyte,count=0, n;

char filename[50];

char filetmp[50] = "/var/www/html/update/log/";

char fok ;

char buf[MAX_BUFFER_SIZE];

int loop = 1;

char command[70] = "php /var/www/html/update/insert.php ";

char ID[10] = "";

//取得使用者代碼

read(client_sockfd, &filename, sizeof(filename));

//接收 client 上傳檔案 strcat(filetmp, filename);

read(client_sockfd, &fok, sizeof(fok));

if(fok == 'Y') {

fp = fopen(filetmp,"wb");

while(loop) {

n = read(client_sockfd, &buf, sizeof(buf));

if (n <= 0) loop = 0;

else {

fwrite(buf, sizeof(char), n, fp);

loop = 0;

strncat(ID, filename, strlen(filename) - 6 );

strcat(command, ID);

//執行更新 php 指令

Ø NetCLI(char id[]);

Ø int NetConnect(char msg[]);

說明:連線函式,並會傳回連線成功與否 參數說明:

ü char msg[] 連線情況(output)

Ø int downLoadFile(char filename[], char lastupdtime[]);

說明:下載檔案函式,根據檔名與上次更新日期下載檔案 參數說明:

ü char filename[] 檔名(input)

ü char lastupdtime[] 上次更新日期(input)

Ø int upLoadFile(char filename[]);

說明:上傳檔案函式,根據指定的檔名上傳檔案 Ø void netComd(char comd[]);

說明:與 Server 溝通函式,用來傳入參數要求 Server 做下載或是 上傳檔案等動作

參數說明:

ü char comd[] 與 Server 溝通命令(input)DL:下載檔案,

UL:上傳檔案,DC:中斷連線 Member Data:

Ø int sockfd;

說明:socket 編號

Ø struct sockaddr_in address;

說明:連線位址

Ø char buf[MAX_BUFFER_SIZE];

說明:資料傳輸 buffer

Ø char IP[MAX_ADDR_LEN+1];

說明:存放連線 IP 位址用變數 庫連線時所需要的資訊,包括 IP,ID, PASSWORD, DB_NAME,檔案位 置:/var/www/html/update/。

第三部分所要達成的功能是將在 phpMyAdmin 執行資料庫的資料 異動時,內部所產生的 SQL 指令給抓取出來,並匯入特定資料表,然 後等到 PDA 端的使用者要進行更新的時候,便會直接依照之前更新的 日期來判斷所要讀取的 SQL 起始段落,並且藉由檔案抓回 PDA 端來 執行,以達成資料庫的動作同步化,資料庫的內容自然就會相同了。

在這個部分中,程式將分成兩部分來進行,一是自動抓取 SQL 指令並 原本抓取到的 SQL 匯入資料表,內定的資料表名稱為”action”,如此 即可。

當所執行的修改或新增等動作的 SQL 都存入資料表中後,接著就 是讓 PDA 端連線來抓取所需的 SQL,此部分的檔名為:upd.php,檔 案位置:/var/www/html/update/,此部分程式的做法就是先抓取 PDA 端 所設定的最後更新時間及下載檔案名稱,接著開始執行檔案,依照最 後更新時間與 SQL 的執行時間來比對需要抓取的 SQL 有哪些,然後輸 入至所建立的檔案後儲存並關閉。接著 PDA 端只要將檔案抓回去,然 後依其 SQL 執行,即可達到 Server 端與 PDA 端動作一致的更新作用。

B.5 網站

網站部份的 code 在 server 上/var/www/html 裡面,網站分成最新消 息(News)、軟體下載(Download)、景點介紹(Fun)、討論區(Forum)、景 點路線圖、關於本站(Profile)、相關連結(Links)等部份就依序放在 news、download、fun、phpBB2、profile、links 等資料夾內,img 資料 夾則是存放圖檔相關的部份,像是 logo。Main 資料夾內放的是首頁的 程式碼,left.php 是會員登入及推薦景點的 code,而 banner.php 則是放 廣告圖檔和廠商資料修改的連結。

附錄 C 工作規劃

4 資料庫(DB2)install完成與 2002/3/25 2002/4/5 2 週 搜集公車資料

7 client端與sever端傳接送資 2002/4/15 2002/4/22 1 週 1 日 料完成

圖 C.2 實際工作進度表

在文檔中 PDA與資料庫之應用-台北通 (頁 146-155)

相關文件