第六章 結論
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 實際工作進度表