摘 要: 针对目前信息安全成为国家重要安全战略,中国军用电脑已装国产操作系统“麒麟”等,信息电子产品国产化必将成为趋势,而麒麟操作系统是一款基于 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 服务器功能结构图
1.2、客户端功能
客户端基本功能包括:(1)用户的登录与注册:记录用户的个人提交信息,包括合法邮箱等,注册成功后返回账号作为用户系统唯一标识。在下次登录的时候,即可仅通过验证账号和密码来实现登录;(2)用户之间的信息交换:用户好友列表中的互加好友可以完成文字信息和文件的传递;(3)用户资料的查看和修改:在聊天的过程中,用户能查看感兴趣用户的个人信息;(4)显示在线好友:用户登陆后会从服务器返回用户的对应好友列表信息及登陆状态信息;(5)利用 POP3 协议发送指向特定邮箱的邮件。
2、系统设计
2.1、数据表结构设计
本系统服务器采用 Mysql 数据库软件,Mysql是一个开源的小型的关系型数据库管理系统[4]。目前 Mysql 数据库集成 LMAP、WMAP 框架,其体积小、速度快、总体拥有成本低,作为 WEB 开发中后台数据存储的主流平台[5-6]。数据库(Mysql):在使用 Mysql 时必须将数据库帐号设置成 root 密码:123456,该数据库中包含有一个用户表,服务器处理用户信息都是对这个表进行操作的。用户表(usermsg):用户表里包含了用户的所有可以用到的信息,有帐号,称昵,密码等信息。用户信息表(usermsg)见表 1。
图 2 客户端整体框架
表 1 用户信息表(usermsg)
2.2、GTK +和 Mysql 开发过程中的问题
结合 Mysql、Linux、GTK +开发系统,为了解决 GTK+缺少数据库 API 的问题,本文利用 Mysql提供的 CAPI 实现数据的存储,GTK+仅作为用户间交互的界面开发。利用 GTK+提供的事件传递机制实现整个模块功能的集成[7]。
2.3、系统界面设计
GTK +有丰富的 GTK Widget 构件,这些构件实现了类型、继承检验和信号/回调函数的基础结构。由 C 语言编写这一特性决定了它有很好的可移置性。本文采用 GTK+2.0 编程技术实现服务器端和客户端程序界面设计。通过 GTK +的事件传递机制。实现通信连接、信息发送、信息提交,信息验证,文件传送等功能[9],即时通讯系统主要界面包括:
1)登陆界面:双击客户端应用程序,弹出登录窗口,本界面需要两个文本框和两个命令按钮,一个是用户账号文本框,一个是用户密码文本框和一个登陆按钮,一个注册按钮;2)注册界面:点击注册按钮跳到注册窗口,输入指定信息注册成功后弹出账号提示信息,这时请牢记自己注册的账号,返回登录。
应设计四个文本框和两个命令按钮,四个文本框分别用于输入网名,密码,密码,电子邮件,两个按钮分别是提交和重置;3)主界面:登陆成功后可弹出好友列表即主界面,该页面显示所有在线的好友,主窗口会显示当前用户的信息及好友列表,好友列表分成在线好友和不在线好友,不能与不在线好友聊天,单击一个不在线好友即弹出不能会话提示对话框;4)聊天界面:点击在线好友,可弹出聊天对话框,包含的构件应该有一个显示聊天消息的列表框,一个发消息的文本框和一个历史记录按钮,一个文件传输按钮及一个发送邮件按钮;5)文件传输界面:文件传输界面有包含一个选择文件的选择框和一个发送按钮;6)发送邮件界面:一个输入电子邮件地址的文本框,一个输入标题的文本框,一个输入正文的列表框及一个发送按钮;7)聊天记录界面:聊天记录界面只要一个显示聊天记录的列表框就行了。
3、Socket 即时通信设计关键技术
网络通信的关键是 Socket(套接字),是一个通信链的句柄,用于描述 IP 地址、端口号,连接建立后,则可以发送消息或执行命令。采用 C/S 模式的程序中,服务器端和客户端都要拥有属于自己的Socket。通常服务器程序用 listen(sockfd,MAX_CLIENT)监听指定的端口,接收用户的 Socket 请求,异步处理多个登陆管理员客户端的请求。假如客户端发出 TCP 请求,服务器会新建专用与这个客户通信的 Socket,并把这个 Socket 加入到 FD_SET套接字集合中,运用 selec(tmaxfd,&sockset,NULL,NULL,NULL),循环遍历所有的 Socket 处理有信息请求的客户端请求。远端客户端,使用 Socket 通过 connet( )向服务器发出连接请求,服务器返回接受确认后,就可以发送消息或执行命令,并且建立不死线程通过该线程等待服务器给客户端的信息,具体是通过 select(sockfd+1,&sockset,NULL,NULL,NULL)阻塞等待服务器的信息。会话完成后,关闭 Socket[10]。
4、界面部分实现的基本算法
4.1、Linux 内核线程处理机制
即时通信启动后,程序要一直在监听是否有新的信息到达。基于功能特性决定为避免程序进入假死状态,程序要采用多线程机制。将等待监听作为一个单独运行的子线程,可以提高程序响应效率,提高用户体验,这个线程也叫心跳线程。本系统在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.2、GTK 消息处理机制
GTK+的本质是事件驱动,gtk-main()函数启动时程序进行静默状态,用户点击界面操作后激活事件,程序被唤醒,GTK+将主线程执行权交给处理用户操作的函数,这一系列操作都是由 ANSI C 语言完成功能逻辑的。窗口控件事件发生,激活消息信号,GTK+专门的信号处理机制会捕获信号[13],将激活相应的回调函数完成信号处理。
对象事件与回调函数的关联标签是由不同的返回值决定的。按照函数声明的顺序执行回调函数,可以解决同一个对象与多个回调函数的匹配。信号处理器的创建函数定义中,参数 object 表示产生信号的 widget 构件,参数 name 表示捕获的事件或信号的名称,参数 callback-func 表示事件的回调函数名称,参数 func-data 表示回调函数的参数存在[11]。
要在主程序的前面定义回调函数,函数声明为:voidcallback-fun(cGtkwidget widget,gpointer func-data)。以服务器启动主程序为例,服务器启动主程序启动函数是:void button_start_clicked(GtkWidget * but-ton,gpointer data)。给出程序中函数之间运行顺序跟关系的参照图如图 3 所示。
图 3 函数之间运行顺序跟关系的参照图
5、系统功能测试
在 Linux 环境下运行客户端,以局域网中的一台主机作为服务器。
测试的结果为:
1. 注册页面输入以下信息:网名:王晓博,密码:123456;第二个密码框:123456,电子邮件:XXXXX得到:(登陆账号:10012)注册成功的页面如图 3 所示。
2. 登陆页面输入以下信息:帐号:10012 ,密码:123456。登陆成功的结果如图 4 所示。
3. 首先登陆两个账号,如(账号 10011,密码123;账号 10013,密码 123456)。然后. 打开聊天窗口,相互发送信息如图 5 所示。
4. 在聊天窗口点击消息记录按钮,选择一个文件如图 6 所示。点击确定。而后发送结果如图 7 所示。
5. 在服务器发一个系统消息,客户端接收如图8 所示。
图 3 返回注册账号图
图 4 返回好友列表
图 5 两个人进行聊天
图 6 选择文件
图 7 发送结果
图 8 系统消息图
6、总结
随着国内电子信息产品国产化,在 Linux 环境下开发即时通信系统势在必行,本文实现的基于Liunx + Mysql + C + GTK 设计的即时通信系统,这种环境具有极高的性能价格比,较强的安全性,为减少信息安全隐患,防止信息外泄做出贡献。现阶段此即时通信工具尚未达到强大功能,在下一阶段将继续把这个即时通信系统的功能更加完善。
参考文献
[1] 吴勇毅. 工信部力挺软件国产化政策机遇促行业大发展.通信信息报[DB/OL].
[2] 刘皓. 分布式环境下可靠数据同步及通讯的协议分析[J].软件, 2015, 36(9): 113-116.
[3] 张勇, 裴东良, 张会兵. 消息传输系统研究[J]. 软件, 2016,37(3): 51-54.