毕设论文基于Linux平台的聊天软件的设计与研究.docx
《毕设论文基于Linux平台的聊天软件的设计与研究.docx》由会员分享,可在线阅读,更多相关《毕设论文基于Linux平台的聊天软件的设计与研究.docx(53页珍藏版)》请在冰点文库上搜索。
毕设论文基于Linux平台的聊天软件的设计与研究
南京工程学院
毕业设计说明书(论文)
作者:
张德舟学号:
208110333
院系:
通信工程学院
专业:
通信工程(电力通信)
题目:
基于Linux平台的网络聊天软件的设计与研究
指导者:
唐蕾(讲师)
评阅者:
2015年6月南京
DesignandimplementationasoftwarewhichcancommunicateonLinux
ADissertationSubmittedto
NanjingInstituteofTechnology
FortheAcademicDegreeofBachelorofScience
By
DeZhouZhang
Supervisedby
LecturerLeiTang
CollegeofCommunicationEngineering
NanjingInstituteofTechnology
June2015
摘要
Linuxkernel由于其代码的开源及获取方便等优点,越来越受到广大技术人员的青睐。
Linux系统提供了完整的内核源代码,在此代码的基础上可以进行自定义,从而打造属于自己的“专属”系统。
Socket通讯使用C/S模型,Socket上TCP/IP网络应用程序接口(API),提供了很多函数方开发人员利用。
Socket通讯有两种传输协议:
TCP协议和UDP协议,TCP协议是面向连接的,传输可靠的;UDP是无连接的,传输不可靠的,因此本设计中选用TCP。
进程和线程是不同的,进程拥有自身的程序映像和地址空间,是内核调度的基本单元,每个单独的进程都有自己的代码段、数据段以及堆栈,它们使用自己的虚拟地址空间,多个进程间互不影响。
而线程没有自己独立的地址空间,创建出来的新线程和创建它的进程共享一个虚拟地址空间。
这些知识点将在论文中详细介绍。
本设计主要对服务端和客户端程序进行编写并对其进行调试,从而实现客户端和服务端之间的通信。
总的来讲,本设计使用C语言开发,通过Socket建立连接,并创建多个线程的实现多任务。
关键词:
Linux内核;socket;进程;线程;多任务
Abstract
Becauseofmeritinopeningofsourcecodeandgettingconvenient,linuxkernelbecomemoreandmorepopularamongtheprogrammers.LinuxprovidesintegratedsourcecodeofLinux-kernel,peoplecanmakespecialsystembelongstothemselvesbasedonthesourcecode.
SocketcommunicationuseC/Smodel,andtheAPIofTCP/IPonitprovidesplentyoffunctionsforprogrammerstouse.Socketcommunicationhastwotransferprotocols:
TCPandUDP;TCPisconnectionandreliable,butUDPisconnectionlessandunreliable.So,wechooseTCPinthisdesign.
Processisdifferentfromthread.Processhasitproceduremapandaddressspace,it‘sbasicunitofthekernelscheduling,eachsingleprocesshasitsowntext、dataandstack,theyusetheirsvirtualaddressspaceanddon’taffecteachother.Butthreaddoesn’thaveindependentaddressspace,itsharesthevirtualaddressspacewiththeprocesswhocreatesit.Thisknowledgewillbeintroducedinmythesis.
Thisdesignrealizescommunicationbetweenclientandserverbydebugginginclientandserver’scode.Ingeneral,thisdesignusesClanguage,connectsbysocketandcreatesmultiplethreadstoimplementmultitasking.
Keywords:
Linux-kernel;socket;process;thread;multitask
第一章绪论
1.1设计背景
Linux是兼容POSIX的U-like操作系统,大多数重要的UNIX工具、应用程序和网络协议都能在其上运行。
Linux系统目前已经得到了很广泛的应用。
它是由芬兰人LinuxTorvalds开发的。
Linux最初是为intel_x86平台开发的免费操作系统,从那时开始Linux就被陆续移植到其他硬件工作平台。
在服务器方面Linux操作系统一直处于领先地位,比如大型机和超级计算机,但在桌面用户市场只占到了1.5%。
Linux也可以运行在嵌入式设备之中,这些设备主要包括移动电话、平板电脑、网络路由、自动控制设备和电视机等等。
Android是Linux操作系统在平板和智能电话中用的最为广泛的一款操作系统构建与LinuxKernel上层。
基于代码开源的优势,linux具有强大市场竞争力。
只要想获得源码,便可从官方网站上获取LinuxKernel源代码,有了源代码之后就可以自定义操作系统了。
在此基础上安装自己的应用软件,至此一个完整的属于自己的操作系统就诞生了。
通常将这样安装所获得的系统称为Linux系统,这是因为它包含的不止一个内核。
提及Linux,那就得提到GNU和Unix。
1983年9月27号,RichardStallman希望开发一套完整的开放源码操作系统以取代Unix,从而诞生了GNU。
1985年,发表GNU宣言;1989年,发表GNU(GNUGneralPublicLicense,GPL);GPL的开源思想使得我们的学习之路顺畅了许多。
GPL保障了Linux不仅仅是当下自由可用,而且今后经过任何修改后还是自由可用的,这点充分体现了Stallman的初衷。
Unix是于1969年在美国AT&T公司贝尔实验室开发出来的具有多任务,多用户的操作系统。
Unix的前身叫做Multics,由BELLLabs参与研发,可是由于进度缓慢,BellLabs不得不放弃了这个计划。
在这之后就由贝尔实验室的职员Kenthompson,DennisRitchie等继续自行开发。
在此之后的10年里,Unix在大型企业和学术界得到了普遍的应用,其不断扩大的影响力终究还是引起了AT&T的关注,就这样一场持续许久的版权官司开始了,直到AT&T将自己的贝尔实验室卖给Novell接手。
最初的UNIX是用PDP-7汇编语言别写的,但因为其在系统编程方面没有太大优势,于是Thompson和Ritchie两人对其加以改造,并于1971年共同发明了C语言。
1973年thompson和Ritchie用C语言重写了UNIX,UNIX第三版就这样问世了。
在当时,系统程序大多是由汇编语言编写,thompson和Ritchie此举是非常具有革新意义的。
用C语言编写的Unix代码紧凑简洁、易读、易修改,为此后Unix的进一步发展奠定了扎实的基础。
1.2应用概述
嵌入式Linux是指运行在分布式嵌入式设备上的Linux操作系统,尽管“embedded”这一词经常用来讨论内核方面的知识,但嵌入式应用上的Linuxkernel并没有什么特别之处。
Linux内核都是一样的,只不过在不同的嵌入式设备上需要进行不同的编译步骤,从而让Linux操作系统能够在嵌入式设备上跑起来。
嵌入式操作系统就是将Linux内核和其他各种软件编译成的能够运行在嵌入式分布式设备中的系统。
你得通过付款的方式获得这特定的编译工具,这些编译工具通常指:
交叉编译器、调试器、项目管理软件、引导镜像等等,从而得到完整的一个运行在嵌入式设备上的操作系统。
随着网络的不断发展,网络在嵌入式系统中应用十分广泛,越来越多的嵌入式设备均采用Linux操作系统。
传统的嵌入式系统设备如:
空间站、自动系统、消费电子系统、电话等等都使用Linux系统,但这些嵌入式Linux系统大体上都相同,没有什么新颖的特色。
而且这些都没有提及到系统的结构,Linux系统的结构真正信息包括:
大小、实时、网络能力、和用户的交互能力。
Linux系统的选型非常重要,针对不同用户的需求不一,Linux有很多发行版,在这之中又分很多类:
桌面版、服务器版、企业版。
桌面版针对的大多是普通用户,有很好的桌面环境,比较适合于新手;服务器版多倾向与终端界面,没有较好的桌面环境,在服务器开发方面有很大优势;企业版则面向的大多是大型企业,对信息安全,网络稳定方面都很高。
Linux由于其公开的源码及免费的操作系统,在Linuxkernel的代码获取及相关构建工具没有任何限制。
因此对基于Linux平台的Socket网络编程的研究就显得很重要,下图1.1为其C/S简易模式图和图1.2详细模式图:
图1.1C/S简易模式图
图1.2C/S详细模式图
编写Socket的server和client端程序,双方通过socket建立连接,从而完成进一步的通信。
1.3为什么选择Linux
1.代码的质量和可依赖性。
质量和可依赖性是衡量代码优劣的重要标准。
尽管在“qualitycode”众说纷纭,但是大多数编程人员所期望的都有如下几点:
(1)模块化:
每一个功能都写成一个模块,这样不仅易于读写,更加方便以后的移植;
(2)可读性:
一段代码应该能让别人看的下去,这里包括变量的定义,尽量取有意义的变量名,避免inti,j这样的定义;一段杂乱的让人看一眼就不想往下看的代码一定是不好的,不管功能有多牛。
;
(3)可扩展性:
在增加新的功能时,不要对原来的代码进行大篇幅的修改,而是只要添加对应的功能即可;
(4)可配置性:
可以选择对应的功能特色进行编译,不要的就不编译,从而生成的程序适合自己的使用。
但是配置的过程应该尽量简单人性化。
2.TCP/IP协议由网络层的IP协议和传输层的TCP协议组成,是Internet最基本的协议、是Internet国际互联网络的基础。
Socket通信所采用的协议分为面向连接(TCP)和非面向连接(UDP)的两种,但由于UDP效率较高但是传输不可靠,不能胜任复杂的网络环境,不得不通过超时和重传等手段来实现较高的可靠性;然而TCP在数据传输方面提供了完全的可靠性,因此选用TCP/IP协议更加可靠些。
3.代码的可获得性。
Linuxkernel源码及所有的开发和编译工具是很方便从网络上获取的。
Linux中最重要的部分Linuxkernel分布在GPL下。
其他的代码也分布在相同的证书下,如BSD等。
构成Linux的大部分代码都是没有限制的。
当源码的访问受限时,开放自由软件组织就会寻找新版本的源码包代替原有的代码。
正是由于这一特性,Linux受到很多电话制造商的青睐,他们将其移植到自己产品中,稍作修改优化使其适合自己的产品。
4.硬件支持。
Linux支持不同种类的硬件平台和设备,尽管有些驱动暂不支持Linux系统,但是对此有很大的期待。
因为很多驱动都由Linuxshequ维护着,你可以毫无顾忌的使用这些驱动。
各种硬件协同工作,使你的工作更加顺畅。
你希望在你自己电脑上编写的程序能够在另一架构的操作系统上正常运行,甚至有不同的设备驱动运行在不同的系统架构上。
5.通信协议和软件标准。
Linux提供了广泛的通信协议和标准的软件支持。
这使得整合Frameworks及相关软件到Linux上变得更加容易。
同时,Linux是U-like的,可以方便的将UNIX程序移植到Linux上。
事实上,许多应用被绑定在一些商用Unixes中,继而被移植到Linux中。
1.4论文的主要工作
第一章:
绪论,大体介绍Linux操作系统发展、应用的现状以及我们选择Linux系统的原因;
第二章:
介绍Linux软件开发中使用的编译工具和调试工具及其简单的使用方法;
第三章:
介绍设计是怎样实现的以及在实现的过程中用到了哪些关键技术并对这些关键技术作简要分析;
第四章:
介绍设计相关的主要代码的实现过程,依次对服务器和客户端主要流程进行介绍,必要的功能展示;
第五章:
设计总结与展望
第二章Linux编程常用工具
2.1嵌入式C语言
C语言最初是由贝尔实验室的职员Thompson和Ritchie于1971年共同开发。
其应用场景很多,如:
操作系统:
Linux;
微控制器:
汽车和航天飞机;
嵌入式处理器:
电话和便携式电子设备等;
DSPProcesser:
数字音频图像处理和TV系统等。
程序的生成过程如图2.1所示:
图2.1程序的生成过程
C语言能够在编程开发领域受到如此高的青睐,主要有以下几个方面的原因:
1.通用性。
因而在跨平台开发时非常方便,C语言的这一特性吸引着广大编程爱好者;
2.执行速度快。
可以指定编译选项从而省去中间过程,以进一步提升程序的执行效率。
3.可移植性。
由于各个平台的差异,当一个程序到不同平台上,只需要从新编译一下源代码即可使用;
4.发展快速。
C语言发展较快。
在上世纪80年代末期由AmericanNationalInstitude发布的ANSIC的C语言标准奠定了其发展的基石。
2.2GCC工具链
GNU/Linux操作系统上往往使用gcc作为编译工具。
其不是一个单独的程序,而是多个程序的组合,因而通常称为toolchain(工具链)。
GCC的全称是GNUComplierCollection,是由GNUProject提供的支持多种编程语言的编译器。
GCC是GNUtoolchain中的重要组成部分,GCC作为一个工具和实例,在自由软件的成长过程中扮演着重要的作用。
同年12月,GCC扩展到能够编译C++,不久之后能够支持的语言更多,如Objective-C、Objective-C++、Fortran、Java和Ada等等。
GCC被移植到多种架构的处理器,并作为一种专业软件开发工具配置于系统中。
GCC同时也集成于大多数嵌入式平台,包括Symbian,AMCC等。
作为GNU操作系统官方指定编译器,GCC被其他U-like操作系统吸收采用,包括Linux和BSD家族。
程序的编译过程如图2.2所示:
图2.2源码到可执行文件的过程
2.2.1GCC的用法
对于GCC的编译选项只要掌握一些常用的选项就可以,其他多大100多种选项有些工程师可能一辈子也不会用到。
gcc基本用法:
gcc[-Wall][-O1..3][-g][-oname]file...
-Wall:
打开所有警告项
-O:
设置优化级别,O0表示关闭优化功能
-g:
将调试信息编译到目标文件中
-oname:
指定输出文件的名称是name
file:
被编译(链接)的文件
2.2.2调试和剖析选项
gcc–g:
以本机格式(stabs,COFF,XCOFF,orDWARF2)生成调试信息供gdb使用。
在大多数系统上,“-g”产生的调试信息只能供GDB使用,这种调试信息在gdb中能很好的工作,而在其他调试器上不是读取不了就是调试器异常崩溃。
如果你想指定调试信息的格式,可通过如下方式:
-gstabs+、-gstabs、-gxcoff+、-gxcoff、-gvms
gcc允许同时使用‘-g’、‘–o’,这种使用方法将会产生令你意想不到的效果:
你定义的一些变量可能不存在、程序会跑飞掉、一些语句不会被执行。
不管是否提供可能的优化输出,但可以肯定的是,这将会产生一些bug。
但是这种方法使得你能够在和最终产品尽可能相同的情况下对代码进行调试。
应当注意,如果你同时使用这两个编译选项,必须清楚所写的某些有关代码已经在优化时被GCC作了些改变。
2.3GDB调试器
GDB(GNUDebuger),是GNU操作系统的标注调试器;。
GDB作为GNU系统的一部分于1986年由RichardStallman编写,是GPL下的自由软件。
使用者可以监视和修改程序的内部变量,甚至可以独立地调用程式正常行为的函数。
GDB能对多种不同处理器架构上运行出错的应用软件排错,这些处理器架构包括:
Alpha、ARM、AVR、H8/300、AlteraNios/NiosII、System/370、System390、X86及其64位扩展。
GDB明显的限制是在他的运用方面,没有较亲和的图形界面,预设只有命令行界面可用。
Gdb是为了让你能够“看到”另一程序执行时具体做了什么或者是另一程序崩溃时发生了什么
GDB可以做四件事情帮助你找到程序中的bug:
(1)启动你的程序,指定任何可能影响其行为的变量或函数等;
(2)使你的程序暂停(设置断点)或者指定特定的状态;
(3)当你的程序终止时,检测发生了什么;
(4)改变你程序中的事情,这样你就可以尝试纠正一个bug的影响以便继续往下找另一个bug。
2.3.2GDB用法
gdb的基本命令:
gdb提供的各种各样的命令有着不同的功能。
从简单到复杂,以下列出了一些常用的gdb调试命令:
(1)filefilename:
在gdb模式中无需退出即可通过file命令装在你要调试的文件
(gdb)filedavid
Readingsymbolsfrom/home/david/Graduation_project/david...(nodebuggingsymbolsfound)...done.
(2)kill:
通过kill命令可以终止当前正在调试的程序
(gdb)kill
Killtheprogrambeingdebugged?
(yorn)y
还有一些常用的如:
n(next)、s(step)、run和q(quit)将在下节例程中详细说明。
2.3.1用gdb调试GCC程序
在终端输入gdb回车后,会出现如下一长串内容:
david@zdz:
Graduation_project$gdb
GNUgdb(Ubuntu/Linaro7.4-2012.04-0ubuntu2.1)7.4-2012.04
Copyright(C)2012FreeSoftwareFoundation,Inc.
LicenseGPLv3+:
GNUGPLversion3orlater//gnu.org/licenses/gpl.html>
Thisisfreesoftware:
youarefreetochangeandredistributeit.
ThereisNOWARRANTY,totheextentpermittedbylaw.Type"showcopying"
and"showwarranty"fordetails.
ThisGDBwasconfiguredas"x86_64-linux-gnu".
Forbugreportinginstructions,pleasesee:
<
(gdb)
Gdb的一些使用命令如果记不住的话可以查看官方手册,没必要硬记,准其自然,每次不会的时候翻翻手册,时间长了自然就记住了
下面只介绍一些常用的几个命令:
比方说,现在有一个通过gcc编译好的可执行文件david,在程序中我定义了两个变量x,y赋初值为5,6终端执行
david@zdz:
Graduation_project$./david
Theresultis:
x+yis11
x*yis30
x/yis0
那么通过gdb来看看发生了什么:
david@zdz:
Graduation_project$gdbdavid
(gdb)
我们现在告诉gdb使用窄于通常的显示宽度:
(gdb)setwidth70
下面我要知到david这个程序怎样工作的,通过阅读源程序我大体知道工作流程,所以我可以设置断点:
(gdb)breakcount
Breakpoint1at0x400579
接下来运行程序:
(gdb)run
Startingprogram:
/home/david/Graduation_project/david
Theresultis:
Breakpoint1,0x0000000000400579incount()
可以发现程序停在count()函数这个地方,Theresultis:
这句话显示count()函数之前都已运行完毕。
现在我可以通过n(next)让程序执行到下一行
(gdb)n
Singlesteppinguntilexitfromfunctioncount,
whichhasnolinenumberinformation.
x+yis11
x*yis30
x/yis0
0x0000000000400573inmain()
还可用backtrace命令查看在栈中的什么位置,显示每一个激活的子函数的栈结构:
(gdb)backtrace
#00x0000000000400573inmain()
通过输入q(quit)退出gdb模式:
(gdb)q
Adebuggingsessionisactive.
Inferior1[process3423]willbekilled.
Quitanyway?
(yorn)y
david@zdz:
Graduation_project$
第三章设计的实现及主要技术
3.1实现分析
本节主要对设计的功能和设计思路进行简单的介绍
3.1.1功能分析
客户端的点点通信及文件的传送。
主要包括Server端和Client端:
1.Server端:
主要负责处理用户发送过来的消息,对用户的系列动作进行管理(登陆、注册、私聊、群聊)和对用户的数据进行管理(查看用户的账户信息)。
2.Client端:
主要可以和其他用户私聊及群聊,还可以向其他用户发送文件。
3.1.2设计分析
服务器对Socket的初始化:
网络协议的指定、端口的指定,具体步骤将在Socket中进行仔细介绍,