趙向兵,張景安
Linux平臺即時通信系統的研究與開發
趙向兵,張景安
(山西大同大學數學與計算機科學學院,山西 大同 037009)
針對目前信息安全成為國家重要安全戰略,中國軍用電腦已裝國產操作系統“麒麟”等,信息電子產品國產化必將成為趨勢,而麒麟操作系統是一款基于Linux的操作系統,但是在Linux局域網環境下沒有一款即時通信軟件可供選擇。經研究Linux Socket網絡編程,及用戶界面編程知識,本文設計出基于Linux的C/S模式即時通信系統,此設計基于Linux C語言開發,使用GTK制作圖形界面,并涉及到TCP/IP和POP/SMTP協議,實現聊天,記錄聊天記錄,發送電子郵件,發送文件功能。從而填補國家信息電子產品國產化在即時通信方面的空白。
信息安全;麒麟操作系統;Liunx;即時通信系統
2013年“棱鏡門”事件已經暴露了我國國內信息安全的極大隱患,國內的重要信息系統、操作系統、數據庫、中間件等幾乎都來自國外產品,國內信息電子產品主要部件過度依賴進口,如果信息電子產品植入監測插件,就會成為竊取情報的手段。隨著信息安全隱患問題日漸凸顯,國家已經加強重視信息安全問題,并把信息安全列入國家重要安全戰略之中。微軟目前主打的Windows 8操作系統采用不安全的技術架構,并且系統集成的殺毒軟件可以自由掃描用戶電腦,勢必失去電腦的控制權,導致用戶個人信息的泄漏。2014年5月中央國家機關政府采購中心發布通知,中央機關所有計算機類產品不允許安裝Windows 8操作系統。同時,我國將實行網絡安全審查制度,工信部也提出措略支持國內軟件信息服務業發展。要解決國家安全戰略問題迫切需要國內信息安全的自主創新,自主可控的國產產品才是安全可信的,才能真正全面完整有效抵御境內外敵對黑客勢力的滲透、入侵[1]。
在網絡越來越發達的今天,人們對網絡的依賴越來越多,越來越離不開網絡,網絡聊天已成為上網族的一種普遍的休閑方式,所以,一款好的即時通信[2-3]聊天軟件成了上網的必備工具之一。國產操作系統基本以安全性能良好的Linux操作系統為基礎,但是當前在Linux局域網環境下沒有一款即時通訊軟件可供選擇,本文設計出基于Linux的C/S模式即時通訊系統,它是基于Linux C語言開發,使用GTK+制作圖形界面,并涉及到TCP/IP和POP/SMTP協議,實現聊天,記錄聊天記錄,發送電子郵件,發送文件功能。
1.1服務器端功能
系統對于用戶權限的限制主要是在服務器端(如圖1)進行管理控制。管理員登錄系統后,開啟服務器,可對用戶資料和聊天記錄進行查詢、刪除等操作。這些數據和信息將存入后臺數據文件中保存,而普通用戶只有通過注冊到服務器后驗證通過才可使用服務器提供的服務,服務器具有的功能:驗證登陸信息,發送系統信息,處理新用戶的申請信息,更新用戶服務。

圖1 服務器功能結構圖
1.2客戶端功能
客戶端基本功能包括:(1)用戶的登錄與注冊:記錄用戶的個人提交信息,包括合法郵箱等,注冊成功后返回賬號作為用戶系統唯一標識。在下次登錄的時候,即可僅通過驗證賬號和密碼來實現登錄;(2)用戶之間的信息交換:用戶好友列表中的互加好友可以完成文字信息和文件的傳遞;(3)用戶資料的查看和修改:在聊天的過程中,用戶能查看感興趣用戶的個人信息;(4)顯示在線好友:用戶登陸后會從服務器返回用戶的對應好友列表信息及登陸狀態信息;(5)利用POP3協議發送指向特定郵箱的郵件。
2.1數據表結構設計
本系統服務器采用Mysql數據庫軟件,Mysql是一個開源的小型的關系型數據庫管理系統[4]。目前Mysql數據庫集成LMAP、WMAP框架,其體積小、速度快、總體擁有成本低,作為WEB開發中后臺數據存儲的主流平臺[5-6]。
數據庫(Mysql):在使用Mysql時必須將數據庫帳號設置成root密碼:123456,該數據庫中包含有一個用戶表,服務器處理用戶信息都是對這個表進行操作的。用戶表(usermsg):用戶表里包含了用戶的所有可以用到的信息,有帳號,稱昵,密碼等信息。用戶信息表(usermsg)見表1。

圖2 客戶端整體框架

表1 用戶信息表(usermsg)
2.2GTK +和Mysql開發過程中的問題
結合Mysql、Linux、GTK +開發系統,為了解決GTK+缺少數據庫API的問題,本文利用Mysql提供的CAPI 實現數據的存儲,GTK+僅作為用戶間交互的界面開發。利用GTK+提供的事件傳遞機制實現整個模塊功能的集成[7]。下面是一個GTK +和Mysql相結合的示例程[8]:
Mysql操作程序結構:
void db-operate (char *abname)
{ Interface-create();/ /界面的初始化
db-init (dbname) //數據庫的初始化
operate(); // 數據庫操作
db-cIose(); / / 數據庫關閉
}
主程序結構:
gtk-init (Sargc, Sargv);/ /GTK + 初始化
db-operate (“db-name”)/ / MySOL操作
gtk-main ();/ /GTK + 事件循環
2.3系統界面設計
GTK +有豐富的GTK Widget構件,這些構件實現了類型、繼承檢驗和信號/回調函數的基礎結構。由C語言編寫這一特性決定了它有很好的可移置性。本文采用GTK+2.0編程技術實現服務器端和客戶端程序界面設計。通過GTK +的事件傳遞機制。實現通信連接、信息發送、信息提交,信息驗證,文件傳送等功能[9],即時通訊系統主要界面包括:1)登陸界面:雙擊客戶端應用程序,彈出登錄窗口,本界面需要兩個文本框和兩個命令按鈕,一個是用戶賬號文本框,一個是用戶密碼文本框和一個登陸按鈕,一個注冊按鈕;2)注冊界面:點擊注冊按鈕跳到注冊窗口,輸入指定信息注冊成功后彈出賬號提示信息,這時請牢記自己注冊的賬號,返回登錄。應設計四個文本框和兩個命令按鈕,四個文本框分別用于輸入網名,密碼,密碼,電子郵件,兩個按鈕分別是提交和重置;3)主界面:登陸成功后可彈出好友列表即主界面,該頁面顯示所有在線的好友,主窗口會顯示當前用戶的信息及好友列表,好友列表分成在線好友和不在線好友,不能與不在線好友聊天,單擊一個不在線好友即彈出不能會話提示對話框;4)聊天界面:點擊在線好友,可彈出聊天對話框,包含的構件應該有一個顯示聊天消息的列表框,一個發消息的文本框和一個歷史記錄按鈕,一個文件傳輸按鈕及一個發送郵件按鈕;5)文件傳輸界面:文件傳輸界面有包含一個選擇文件的選擇框和一個發送按鈕;6)發送郵件界面:一個輸入電子郵件地址的文本框,一個輸入標題的文本框,一個輸入正文的列表框及一個發送按鈕;7)聊天記錄界面:聊天記錄界面只要一個顯示聊天記錄的列表框就行了。
網絡通信的關鍵是Socket(套接字),是一個通信鏈的句柄,用于描述IP地址、端口號,連接建立后,則可以發送消息或執行命令。采用C/S模式的程序中,服務器端和客戶端都要擁有屬于自己的Socket。通常服務器程序用listen(sockfd,MAX_ CLIENT)監聽指定的端口,接收用戶的Socket請求,異步處理多個登陸管理員客戶端的請求。假如客戶端發出TCP請求,服務器會新建專用與這個客戶通信的Socket,并把這個Socket加入到FD_SET套接字集合中,運用select(maxfd,&sockset,NULL,NULL,NULL),循環遍歷所有的Socket處理有信息請求的客戶端請求。遠端客戶端,使用Socket通過connet( )向服務器發出連接請求,服務器返回接受確認后,就可以發送消息或執行命令,并且建立不死線程通過該線程等待服務器給客戶端的信息,具體是通過select(sockfd+1,&sockset,NULL,NULL,NULL)阻塞等待服務器的信息。會話完成后,關閉Socket[10]。
遠程控制通過如下幾個步驟實現:
第一步,Socket定義,本系統服務器端采用重復服務器模型[9],算法[14]如下:
SOCKET( ); //建立Socket
BIND( ); //與網絡地址和端口號綁定
LISTEN( ); //在綁定的套接字上監聽客戶端發來的網絡請求
FD_ZERO( ); //清空套接字集合
FD_SET(sockfd,&sockset);//將監聽套接字加入集合初始集合
maxfd=max(maxfd,sockfd+1); //替換最大的套接字號
for (;;)
{ select(maxfd,&sockset,NULL,NULL,NULL);//異步遍歷套接字集合查看狀態有沒有變化
new_sockfd =ACCEPT( ); //接受狀態有變化的套接字
FD_SET(new_sockfd,&sockset);//將監聽到的套接字入集合
WHILE(1)
{
READ( ); //從套接字中讀取數據
PROCESS( ); //解析收到的數據包,匹配后進入第六步進行相應的處理
WRITE( ); //從套接字中寫入數據
CLOSE( ); //關閉套接字
}
第二步,接收數據,解包,實現數據檢測和匹配;
4.1Linux內核線程處理機制
即時通信啟動后,程序要一直在監聽是否有新的信息到達。基于功能特性決定為避免程序進入假死狀態,程序要采用多線程機制。將等待監聽作為一個單獨運行的子線程,可以提高程序響應效率,提高用戶體驗,這個線程也叫心跳線程。本系統在main( )函數中創建多個線程,由linux系統組織線程的合利調度[12]。
GTK+中使用線程,利用g_thread_init(NULL)和gdk_threads_init()完成前期工作。g_thread_create()函數創建線程,接收消息的線程由g_thread_create()函數創建。線程的具體事件回調函數由get_message()函數執行。對于GTK+設計中的線程互斥由于gdk_threads_enter(),gdk_threads_leave()完成全局鎖的獲得和釋放。心跳線程啟動后信息回調函數就被激活。各功能子線程各司其職完成相應的操作。同樣,客戶端的多線程編程與此類似。
4.2GTK消息處理機制
GTK+的本質是事件驅動,gtk-main()函數啟動時程序進行靜默狀態,用戶點擊界面操作后激活事件,程序被喚醒,GTK+將主線程執行權交給處理用戶操作的函數,這一系列操作都是由ANSI C語言完成功能邏輯的。窗口控件事件發生,激活消息信號,GTK+專門的信號處理機制會捕獲信號[13],將激活相應的回調函數完成信號處理。
對象事件與回調函數的關聯標簽是由不同的返回值決定的。按照函數聲明的順序執行回調函數,可以解決同一個對象與多個回調函數的匹配。信號處理器的創建函數定義中,參數object表示產生信號的 widget構件,參數name表示捕獲的事件或信號的名稱,參數callback-func表示事件的回調函數名稱,參數func-data表示回調函數的參數存在[11]。要在主程序的前面定義回調函數,函數聲明為:void callback-func(Gtkwidget widget,gpointer func-data)。以服務器啟動主程序為例,服務器啟動主程序啟動函數是:void button_start_clicked(GtkWidget * button,gpointer data)。
這個函數是進入主線程的接口,它初始化一些變量,打開監聽端口及進入主線程。服務器啟動時會通過POP3將啟動好的服務器地址及端口號發到互聯網上的一個郵箱上去,原因客戶會使用這個地址及端口號,客戶端啟動時從郵箱中讀這個郵件就可以知道服務器啟動時的IP地址及端口號了,這樣省去很多麻煩,其實現包含在下面的函數中:
void button_start_clicked(GtkWidget * button,gpointer data);
主線程負責創建激活其他四個子線程,主線程函數原型是:
void go_to(void);
下面介紹由主線程創建的四個子線程的作用及函數原型。負責處理登陸信息的線程的函數原型:
void func_check(struct check *k);
負責處理注冊信息的線程的函數原型:
void func_check(struct check *k);
負責處理退出信息的線程的函數原型:
void func_quit(char ipip[40]);
系統消息是通過一個函數一個一個向所有在線用戶發的系統消息,這個函數原型是:
void button_message_clicked(GtkWidget * button,gpointer data);
給出程序中函數之間運行順序跟關系的參照圖如圖3所示。

圖3 函數之間運行順序跟關系的參照圖
在Linux環境下運行客戶端,以局域網中的一臺主機作為服務器。另外選取兩到三臺電腦作為工作用戶機按照如下進行測試:
(1)注冊測試
(2)登陸測試
(3)私聊測試
(4)文件傳輸測試
(5)接收系統消息測試
測試的結果為:
1. 注冊頁面輸入以下信息:網名:王曉博,密碼:123456;第二個密碼框:123456,電子郵件:1wangxiaobo@163.com得到:(登陸賬號:10012)注冊成功的頁面如圖3所示。
2. 登陸頁面輸入以下信息:帳號:10012 ,密碼:123456。登陸成功的結果如圖4所示。
3. 首先登陸兩個賬號,如(賬號10011,密碼123;賬號10013,密碼123456)。然后. 打開聊天窗口,相互發送信息如圖5所示。
4. 在聊天窗口點擊消息記錄按鈕,選擇一個文件如圖6所示。點擊確定。而后發送結果如圖7所示。
5. 在服務器發一個系統消息,客戶端接收如圖8所示。

圖3 返回注冊賬號圖

圖4 返回好友列表

圖5 兩個人進行聊天

圖6 選擇文件

圖7 發送結果圖

8 系統消息圖
隨著國內電子信息產品國產化,在Linux環境下開發即時通信系統勢在必行,本文實現的基于Liunx + Mysql + C + GTK設計的即時通信系統,這種環境具有極高的性能價格比,較強的安全性,為減少信息安全隱患,防止信息外泄做出貢獻。現階段此即時通信工具尚未達到強大功能,在下一階段將繼續把這個即時通信系統的功能更加完善。
[1] 吳勇毅. 工信部力挺軟件國產化政策機遇促行業大發展.通信信息報[DB/OL] http://it.people.com.cn/n/2014/0605/ c1009-25108211.html.
[2] 劉皓. 分布式環境下可靠數據同步及通訊的協議分析[J].軟件, 2015, 36(9): 113-116.
[3] 張勇, 裴東良, 張會兵. 消息傳輸系統研究[J]. 軟件, 2016, 37(3): 51-54.
[4] Shuyan SUN, Xiaojuan QI, Yongji YANG. The Design of Scientific Research Project Management System in Universities[J]. Management Science and Engineering, 2014, 8(1): 57-61.
[5] Yuanzhe Zhao, Chundong Hu, Peng Sheng, Xiaodan Zhang, Deyun Wu, Qinglong Cui, Rui Zhang, Yulian Lin, Application Software of Main Control Server for Neutral Beam Injection Control System[J]. Journal of Fusion Energy, 2014, 33(4): 412-416.
[6] 周京暉. 集成消息服務和定時通知的分布式內存數據庫[J].軟件, 2013, 34(1): 89-92.
[7] 陳特放, 黎丹. Linux下用GTK+和MySQL開發基于TCP/IP的網絡聊天室[J]. 長沙大學學報. 2006, 20(5): 54-58.
[8] 宋勁杉. Linux C編程一站式學習[M]. 電子工業出版社, 2009: 276-284.
[9] Harlow E Developing Linux Application with GTK+ and GDK[M]. MacmillanComputer Publishing House, 1999.
[10] 左巖, 趙建玉, 張紅. 基于Linux的嵌入式數據采集裝置的TCP/IP通信[J]. 暨南大學學報(自然科學版). 2014, 28(3): 194-197.
[11] 苑曉芳, 劉志廣. Linux下基于TCP傳輸組建的實現[J]. 無線電通信技術, 2014, 40(4): 46-49.
[12] Neil Matthew, Richard Stones. Beginning Linux Programming(4 edition)[M]. Wrox, 2007.
[13] 余長江, 周淵平, 呂海龍. Linux平臺下基于GTK+的聊天室設計[J]. 通信技術, 2012, 45(5): 98-100.
[14] Emoto. M, Shibata. K, Watanabe. K, Ohdachi. S, Ida. K, Sudo. S. Development of a flexible visualization tool[J]. Fusion Engineering and Design, 2002, 60(3): 367-371.
R&D of the Linux-Based Instant Messaging System
ZHAO Xiang-bing, ZHANG Jing-an
(School of Mathematics and Computer Science, Shanxi Datong University, Datong Shanxi 037009)
For current Information Security has become an important national security strategy, China-made military computer operating system “unicorn” has been installed, and domestic electronic information products will become the trend, while Kylin operating system is a Linux-based operating system, but under the Linux LAN environment there is not an instant messaging software to choose from.After studying Linux Socket network programming, and UI programming knowledge, this paper designs for instant messaging system which is based on Linux C/S mode, and Linux C language development, using GTK graphical interface, relating to TCP / IP and POP / SMTP protocol for chat, recording chats,sending an e-mail, sending the file. So it fills the national electronic information products localization in Instant Messaging System gaps.
Information security; Kylin operating system; Liunx; Instant messaging system
TP311.52
A
10.3969/j.issn.1003-6970.2017.02.006
山西省軟科學研究計劃項目(2014041049-1);大同市軟科學研究計劃項目(2014112-2)
趙向兵(1978-),男,講師,主要研究方向:數據挖掘、大數據。張景安(1970-),男,教授,主要研究方向:云計算、計算機網絡應用技術。
本文著錄格式:趙向兵,張景安. Linux平臺即時通信系統的研究與開發[J]. 軟件,2017,38(2):23-27