一、程式說明:
這是使用socket來製作簡單的聊天室程式,並在傳輸的過程中加入簡單的編碼程式
提高資料傳輸的安全性;另外當使用者登入或登出時記錄相關的資料至Mysql資料庫,
由於需要將相關資料存入資料庫,因此必須在執行server程式前先啟動Mysql的Server。
相關的安裝及操作說明可以參考該篇文章。在啟動Mysql後,執行下列指令將範例中的備份
資料庫新增至Mysql內以便範例可以正常操作。
mysqldump -u root -p yjh_db < chat_room.db
二、程式檔案說明:
server.c 一 用來建立和傳送使用者的訊息並將使用者連線的相關資訊存儲到Mysql資料庫中。
(1) 連接Mysql資料庫,確認使用者登入帳號及密碼是否正確。
(2) 將使用者連線記錄儲存於Mysql的資料庫中。
(3) 將使用者登入和登出及傳送的資料廣播至其他線上的使用者。
(4) 提供五個基本指令-
1. 查詢指令的名稱及功能 2. 查詢目前線上人數
3. 顯示上線使用者連線資料 4. Server的網路組態
5. 關閉Server
client.c 一 藉由傳送訊息到Server後將訊息廣播到其他自用者和接收其他使用者傳送到Server的訊息。
(1) 取得本機中網路組態中的基本設定 (2) 連接並傳送使用者的登入相關資料
(3) 接收Server傳送的訊息 (4) 傳送使用者輸入的訊息至Server
encryption.c 一 提供Server、Client程式中所共用的自訂函式:
(1) 提供傳送資料時進行解碼和編碼的函式
(2) 取得本機網路卡的MAC address和IP Address
(3) 將MAC Address或IP Addres由無符號字元轉換成字串
(4) 資料Checksum的計算函式
(5) 資料傳訊息的傳送及接送函式
三、資料傳送時的編碼方法及資料格式:
資料編碼流程一
(1) 建立一個16個字元的陣例作為查詢表。
(2) 使用XOR的方式來計算傳送資料的Checksum。
(3) 將每個傳送的字元依Server的IP位置來進行xor的運算再進行編碼。
EX. buf[0] ^ IP[0],…,buf[3]^IP[3],buf[4],IP[0],…
(4) 將每個運算後的字元以每四個bits為一組作為查詢表的索引值,來取得相應的字元。
PS:該編碼的方法主要的缺點就是資料量是原來的兩倍。
傳輸資料格式一
使用者登入帳號的資料格式 -
CMD |
NAME LEN |
USER NAME |
PWD LEN |
PWD |
IP ADDR |
MAC ADDR |
Checksum |
0x01 |
1Byte |
4 -10Bytes |
1Byte |
6-16Bytes |
4Bytes |
6Bytes |
2Bytes |
使用者傳送及接受訊息的資料格式-
CMD |
MESG LEN |
Message |
Checksum |
0x01(Login Result) 0x02(Message Deliver) 0x03(Exit Command) |
1byte |
1~255Bytes |
1 Bytes |
四、server端的建立流程:
1、使用shmget及shmat兩個函式來建立Share Memory來儲存使用者的連線資料,
以便讓管理者可以進行查詢相關的連線資料。
2、使用mysqlclient.dll所提供的函式來進行mysql連接。
相關的使用函式可以參考Mysql網站。
3、使用下列三個期式來建立、初始化連線的基本參數:
1-1 getprotobyname - 取得指定協定於系統中的編號。
1-2 socekt - 建立一個socket介面,來接收和傳送訊息。
1-3 bind - 設定socket去绑定一個IP Address當使用者的連線至該位址時,
系統可以連訊息傳送至該socket。
4、成功執行完bind函式後,使用listen函式開始監聽連線的訊息。
5、使用fork函式建立Child Process來專門處理使用者請求建立連線的
要求及使用者登入的認證、訊息的廣播等功能。
6、Parent Process主要建立指令集及處理管理者輸入相關指令的動作。
五、client端的建立流程:
1、使用下列三個函式來建立、初始化連線的基本參數:
1-1 gethostbyname - 可以將機器名(如yunjuihuang.pixnet.net)轉換為一個結構指針.
在這個結構裡面儲存了域名的信息。
1-2 getprotobyname - 取得指定協定於系統中的編號。
1-3 socket - 建立一個socket介面,來接收和傳送訊息。
2、使用上述建立及初始化的參數配合connect函式來進行網路的連線。
3、接收使用者所輸入的帳號及密碼後進行資料編碼及傳送至server進行認證。
4、當認證成功後,使用fork函式建立Child Process來專門接收使用者由鍵盤輸
入的資料及將輸入的資料進行編號及傳送到Server;而且Parent Process主要
用來接收Server端的資料並將其資料顯示於Console上。
六、如何關閉使用者於console輸入時所顯示的按鍵訊息:
主要使用linux所提供的兩個函數tcgetattr及tcsetattr來設定console相關參數。
#include <termios.h>
#include <unistd.h>
int tcgetattr(int fd,struct termios *termios_p);
int tcsetattr(int fd,int optional_actions,const struct termios *termios_p);
EX:
struct termios term, term_orig;
tcgetattr(STDIN_FILENO, &term);
term_orig = term;
term.c_lflag &= ~ECHO;
tcsetattr(STDIN_FILENO, TCSANOW, &term); // TCSANOW 立即變更設定
/* Remember to set back, or your commands won't echo! */
tcsetattr(STDIN_FILENO, TCSANOW, &term_orig);
reference: http://linux.die.net/man/3/tcgetattr
七、執行畫面:
Client端的執行畫面 一三位使用者登入、登出及接收和傳送的訊息。
(1) 第一位使用者畫面 -
(2) 第二位使用者畫面 -
(3) 第三位使用者畫面 -
Server端的執行畫面 -
Mysql 資料庫的設定 一
conenct_info和user_info的表格欄位描述 一
user_info表格的資料內容:
connect_info表可的資料內容 一
Download:chat_room.rar