close

一、程式說明:

      這是使用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) 第一位使用者畫面 -

client1.jpg    (2) 第二位使用者畫面 -

client2.jpg   (3) 第三位使用者畫面 -

client3.jpg

Server端的執行畫面 -  

server.jpg  

Mysql 資料庫的設定 一

conenct_info和user_info的表格欄位描述 一

 describedb.jpg

user_info表格的資料內容:

user_info.jpg

connect_info表可的資料內容 一

connect_info.jpg  

Download:chat_room.rar

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 yunjuihuang 的頭像
    yunjuihuang

    瑞の資訊備忘錄

    yunjuihuang 發表在 痞客邦 留言(1) 人氣()