基于Linux操作系统的聊天软件的设计毕业设计说明书

上传人:1777****777 文档编号:39483407 上传时间:2021-11-11 格式:DOC 页数:38 大小:1.09MB
返回 下载 相关 举报
基于Linux操作系统的聊天软件的设计毕业设计说明书_第1页
第1页 / 共38页
基于Linux操作系统的聊天软件的设计毕业设计说明书_第2页
第2页 / 共38页
基于Linux操作系统的聊天软件的设计毕业设计说明书_第3页
第3页 / 共38页
点击查看更多>>
资源描述
2014届毕业设计说明书 基于Linux操作系统的聊天软件的设计 学 院: 电气与信息工程学院 学生姓名: 指导教师: 职称 讲师 专 业: 电子信息工程 班 级: 电子1002班 完成时间: 2014年5月 摘 要 这篇论文整体是在linux下并通过网络实现类似于qq的的一篇操作报告。开发的框是C/S框架,由server端和client端组成,首先设置好端口参数和ip地址,在编译,调试后实现server端与各个client端的连接,连接后以后server端作为中间端来使客户机实现通讯,因为服务器只存在一个但是客户端存在多个所以我们必须通过链表去管理,client端的信息发送通过封装在socket结构体中进行传输。本设计采用TCP/IP协议这样可以保证连接可靠,而且项目管理中釆用linux流行的gcc和makefile编译,大大提高了编译和调试效率,提高了项目完成的效率,但是为了模拟几个client端我们就需要在pc机上再安装一个虚拟系统来操作client端。本次设计的聊天通信使用全双工,主要实现了功能如:用户的帐号与密码的注册与登录,客户点对点聊天,客户之间的群聊,以及文件的发送与接收。测试运行后的可靠性满足Linux网络聊天的基本要求。关键词:linux, socket, ,server端,client端,网络编程 Abstract This thesis as a whole is under linux platform and through the local area network to achieve similar qq chat. The overall use of C / S framework, the main server -side and client into two parts , set ip and port number , and Linux, compile and debug procedures to achieve client and server connections each client side , and then as the server -side following transfer to achieve communication between client end . Since only one server -side , and you can have multiple client end , so the server side using a single list to manage multiple client side information , client side encapsulated for transmission of information sent through the body in the socket structure . This design uses the TCP / IP protocol ,so you can ensure reliable connection, but also preclude the use of project management in a popular linux gcc and makefile to compile, compile and debug greatly improved efficiency , improve the efficiency of the completion of the project, but due to simulate multiple client end Therefore, in the operating environment need to install a virtual system on the PC to operate multiple client side . The chat tool designed for full-duplex communication using communication , to achieve the five main functions: to-peer chat between new user registration and login, user , group chat among users , file encryption transmission between users. After running the test program to meet the basic needs of network reliability in linux in chat .Keywords : linux, socket, server -side , client end , network programming 目 录 1 绪 论11.1 课题研究的背景及意义11.2 TCP/IP介绍21.3 本文的研究内容42 技术说明与方案选择52.1通信方式52.1.1 UDP通信52.1.2 TCP通信52.2客户/服务器模型62.3网络套接字(socket)的概念72.4多线程的概念72.5I/O多路复用83 系统实现113.1 Linux提供的有关Socket的系统调用113.2 实验过程说明(使用TCP/IP)133.3 TCP通信实现144 运行效果29结束语34致谢35参考文献36附录A 服务器程序38附录B 客户端程序47 1 绪 论 1.1 课题研究的背景及意义随着计算机应用技术的日益普及,网络也遍及到我们生活的每个角落,很好的利用这一资源,将成为我们工作和学习,带来极大的方便。并且可以极高的提高我们的工作效率。所以,各种聊天软件应运而生了。如国外的MSN等,国内主要的有腾讯的qq,还有Ticq和一些在网页上的即时通讯工具,像Chinaren网站上的WebMaster等等,都做得即美观又强大,腾讯的qq有非常大的用户群。这些网络聊天软件极大程度上方便了处于在世界各地的友人之间的联系,无论你和亲人、朋友相隔多远,你都可以随时随地和他们交流。并且,你还可以和外国友人交流学习。在网络发展上,最早出现的是分布在很大的地理范围内的远程网络(WideAreaNetwork,WAN),例如美国国防部高级研究计划局首先研制的 ARPA 网,它从 1969 年建立,至今已经发展成为跨越几大洲的巨型网络。70 年代中期由于微型计算机的出现和微处理器的出现,以及短程通讯技术的迅猛发展,两者相辅相成,又促进以微机为基础的各种局域网络(Local Area Network,LAN)的飞快发展,1975 年美国 Xerox 公司首先推出了 Ethernet,与此时英国剑桥大学研制成剑桥环网,他们是 LAN 的代表。LAN 与 WAN 有所区别,其特点为:1)有限的地理范围,通常网内的计算机限于一栋大楼,楼群或一个企业及单位。2)较高的通讯速率,大多在每秒 1-100M bps ,而 WAN 大多在几十 Kbps。3)通讯介质多样。4)通常为一个部门所拥有。特别是 80 年代以来,以微机为基础,LAN 技术有了极其迅速的发展。90 年代计算机网络化大趋势尤为明显。具称 1978 年全世界约有 700 万人每天使用计算机,而到 1998 年上升到 5000 万人,目前全世界已经拥有超过一亿台的计算机,预计每天上机人数可达 2 亿以上。计算机的性能价格比以每年 25%的速度在提高。微机的应用已经渗透到国民经济的各个部门,乃至家庭和个人。这标志着正步入信息时代,世界范围内的社会信息数据正在每年增长 40%到 45%的年增长率在增加,这就是迫切实现网络化的动力源泉。据称,约有 65%的计算机要联网或已经联网,以求彼此通信,达到资源共享的目标。90 年代计算机网络化更加向深度和广度方向发展。人们要求网络传输的内容范围增加,诸如数据之外,还需传输声音,图形,图象和文字,这就是以网络为基础的多媒体技术,使网络的应用广度更加扩大,并最终为信息化社会的实现所必须的网络连接奠定基础。当前国际 LAN 的市场上,两雄称霸,龙争虎斗的局面,将可能持续相当长一段时间。正如大家知道的那样,80 年代后期美国 Novell 公司先是以“一花独秀,压倒群芳”之势占据了国际 LAN 市场 60%以上,一路领先,扶摇直上,尤其是 NetWare 386 V3.11 版推出后,受到普遍的注目;随后,国际上的软件公司龙头老大 Microsoft 公司先后推出了LAN Manager V1.0(即 LAN 3+ Open)、LAN Manager V2.0 和 V2.1,后来居上,成为世界LAN 的两大支柱之一。1992 年 10 月 Microsoft 又抢先发布了 LAN ManagerV2.2,以更加领先于 Novell 的 NetWare 386 V3.11,但后者立即随后推出了 NetWare 4.0。可见“龙争虎斗”,瓜分市场的情景。Novel LAN 采取了“将网络协议软件与网络操作系统 NetWare 紧密结合起来”的设计构想,可达到节省开销,提高运行效率之目标。Novell LAN 最大的特点是与其底层的网卡的无关性,即是说 NetWare 可以虚拟的在所有流行的 LAN 上面运行,使它成为一个理想的开发网络应用软件的平台,吸引了广大用户软件人员为之开发越来越多的网络应用软件。反过来又推动其发展,同时 Novell LAN 采取了开放协议技术(OPT),允许各种网络协议紧密结合,进而在 NetWare 386 V3.11 版中采用了 NLM 模块的组合技术,可以实现异机种联网的难题。此外,Novell LAN 不需专用服务器,占用工作站内存最小,使用方便,功能强,效率高,兼容性强,可靠性高,保密性强,容错性好。尤其在 NetWare 386 V3.11版中实现了服务器软件的“分布式结构策略”、“横向信息共享”、“报文传送”技术、增添了“TCP/IP 栈”、实现了“SNA 协议”和“开放式数据链路接口”等一系列新技术,使 NovellLAN 更深入人心,扩大了市场。与此同时,微软的LAN Manager V2.1和V2.2局域网版除了有一般的基础的优点,还应用了“客户机服务器”(Client/Server)的强大内网络体系结构,以及基于多用户,多任务并发先进的 OS/2 作为服务器,并以 OS/2,Unix, VMS 和 Windows NT 作为系统的开发平台,更方便与异类机种访问网络。由于 LAN Manager与 Windows 的联系;使它有更高的的性格比。在网络化技术飞速发展的今天,TCP/IP 协议可谓是立下了汗马功劳。起先,TCP/IP(Transmission Control Protocol/Internet Protocol)是由美国国防部于 70 年代提出来的,将中大型机连成的网络互连起来,并按 TCP/IP 协议这种模式实现异网之间通讯,接着美国国防部高级计划局(DARPA)于 70 年代末提出了几种国际互连(Internet)技术。这些技术实现了在科学研究,军事和社会生活迫切需要共享的资料。题1.2 TCP/IP介绍Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议,Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求。通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台电脑规定一个地址。(1) 协议优势在社会长期的发展过程中,IP逐步取代了其余的网络。这是一个简单的解释。IP传输通用数据。数据能够用于任何目的,并且能够很轻易地取代以前由专有数据网络传输的数据。(2)协议的缺点第一,协议在服务,接口方面的区分不明确。好的软件工程在功能与实现上面是有明确的区分的,TCP/IP没有很好地做到这点。第二,主机-网络层本身并不是实际的一层,它定义了网络层与数据链路层的接口。1.3 linux介绍 Linux是一种开源的操作系统,它拥有像Windows和Mac那样的功能齐全的UI界面(GUI,Graphical User Interface)。Linus Torvald。作为一种很棒的操作系统,它具有与Unix,Mac,Windows和Windows NT相似的的功能,但是其中又会有不同的地方。 提到Linux我们一定要知道GNU和Unix。Richard M.Stallman创建的自由软件联盟推出了两种许可证,GNU是通用公共许可证(GNU Gneral Public License,GPL)和GNU函数库通用公共许可证(GNU Library Gneral Public License,LGPL)。除了一些库是以GNU函数库通用公共许可证发行的,其他基本上GNU工程的软件和文档是以GNU通用公共许可证为基础发布的。按照GNU的相关规定,Linux的源代码可以在网上免费自由获取,这一点为我们学习者提供了极大的方便。GPL极大的体现了Stallman的思想:只要用户所做的修改是有利于系统发展的,用户可以自由地使用、拷贝、查询、重用、修改也可以发布这个修改后的软件。就这样GPL保证了Linux的优点不仅现在自由可用,而且经过修改后的系统都仍然可以自由使用。 Unix是由ATT贝尔实验室的Ken Thompson和Dennis Ritchie在已经废弃了的PDP-7上开发的在1969年;刚开始它是一个仅用用汇编语言单编写的一个建议的单用户用户操作系统。后来,又在PDP-11上用C语言重新编写系统,把Unix做成为了一个文本处理系统,这样极大的促进了Unix在贝尔实验室得的使用。Unix的最初版本不收费的供应给众多的大学的计算机系去使用。加州大学伯克利分校的计算机系就是在这众多的大学中,并对Unix进行了完善并且增加了许多新的特点,这就是被广大的开发者所熟知的的BSC版本的Unix。在这个事间的同时,很多其他的的Unix版本也开始萌生。Unix不断发展壮大,许多版本被应用到不同类型的的计算机使用。而Linux最初就是专门为Intel的个人计算机设计的。(1)Linux的昨天 1991年,一名叫Linus Torvalds的芬兰大学生觉得Unix各种版本对于一个类型的机器的兼容性比较差(80386类的机器),于是他决定要开发出一个全功能的、并且支持POSIX标准的、类似于Unix的操作系统的系统内核,该系统取得了BSD和System V 的精华,同进去除了它们的糟粕。他将内核开发到了0.02版,这个版本中已经可以运行gcc、bash和其他少量的应用程序。后来他在英特网的帮助下在在1994年将Linux升级到1.0版本。它的源代码量也呈指数形式迅速增长,实现了基本的TCP/IP功能,在此同时大约有100000用户开始使用Linux操作系统了,Linux系统开始被广大的用户所认可。(2) Linux的今天 作为服务器级的操作系统,在广大的开发者的共同努力下Linux操作系统已经非常成熟了。现在的Linux内核集成了150万多行代码,不仅可以作为Web服务器平台,而且也为越来越多的用户提供文件和打印服务。它既被当作邮件服务器的一种候选平台,也被当作一种强壮而安全的防火墙。 Linux的企业级特性:Linux系统不仅支持多处理器、支持大型文件系统、日志文件系统而且在密集型计算和高可用性集群技术上面也逐步成熟。 现在的Linux的UI界面也在继续完善。KDE桌面提供的图形用户界面在易用性和可配置方面和微软的Windows不相上下。(3) Linux的明天 Linux最强大的生命力在于其开源。每学习者都有可以轻松自由的获取内核源代码,每个人都可以运载源程序并对其加以修改,而后的他人也可以自由获取你修改后的源程序。集市模型就是为Linux这种独特的自由流畅的开发模型已被命名。集市模型是通过重视实验征集和充分利用早期的反馈,通过平衡的配置脑力资源,从而开发出更优秀的软件。 1.4 本文的研究内容本课题的任务是设计一个支持多人群聊以及用户间私聊和文件传送的聊天系统。首先服务器会初始化,然后等待客户端的连接。每连接一个客户端就简历一个线程去监听客户端请求。客户端是注册好了的,只需要登陆。客户端注册成功会把客户端信息保存到链表和文件中。注销时会把对应的链表节点销毁,并且删除文件对应信息。当有多个客户端登陆时,客户端界面会显示其他用户的用户名。可以实现用键选择,然后按回车键进入与其的私聊界面。然后可以和其进行私聊和文件传送。而好友界面的倒数第二个为群聊选择,当进入群聊时,可以实现多人同时聊天。另外,如果其他人下线时。你的显示好友界面里的那个客户端就会消失,同时,有人上线时,会在好友栏加上新加的客户端。最后一个选项是退出,销毁对应线程及文件描述符。 2 技术说明与方案选择 2.1 通信方式2.1.1 UDP通信 UDP是用户数据报协议的简称。UDP在传送数据之前不需要先建立连接,远地主机的传输层在收到udp数据后,不能给出任何确认信息,所以不能保证其交付时信息的可靠性。它的特点是:无连接,不能提供的可靠的信道,但正是因为无连接这个特点使UDP具有很好的传输效率。2.1.2 TCP通信 TCP是传输控制协议的简称,TCP可以提供一条全双工的、可靠的信道。TCP在数据传送之前必须先建立相应的连接,数据传送完成后必须释放连接。但是TCP不能提供广播和多播这些信息服务。 正是因为TCP要提供可靠的、面向连接的运输等多样的服务,所以增加了额外的系统开销,例如确认、流量的控制、计时器以及连接管理等服务都需要消耗许多系统资源。 如果计算机之间使用通信方式是TCP通信,则计算机之间的连接过程需要三次握手实现,如下图1-1所示。 图1-1 用三次握手建立TCP连接 对于计算机连接的释放过程也需要类似的3次握手的互相确认的过程,如实验图1-2所示。 图1-2 TCP连接的释放过程通过以上两种方案的比较,考虑适用性,本次课题我选择了选择TCP通信协议。2.2 C/S模型C/S模型将应用程序分为server端和client端两基本的部分,client端对server端发送请求,server端对其作出相应的回应并开始提供服务。在TCP/IP应用中,多数网络应用程序是使用C/S模型设计的。server端一直处于等待状态,当一个client端提出请求时。Server端马上会根据client端发送的请求从而执行对应操作以至于达到Server端的要求。通常,C/S模型必须包含两个独立的应用程序:client端和Server端的应用程序。在C/S模型中,多个在同样的内网中的计算机都作为client端,与端口号和ip进行连接,并通过Server端传递信息。所以client端的通信既可以理解为client端和Server端之间的通信。所以采用C/S模型进行网络聊天系统的设计需要分别编写client端和Server端的源代码,client端和Server端之间相互通信的程序流程如实验图1-3所示。 图1-3 Socket通信流程图2.3 网络套接字(socket)的概念Socket接口是TCP/IP的API,它提供了相应的功能函数与例程,我们可以使用对应的函数与例程进行TCP/IP应用程序的开发与维护。使用Socket套接字进行网络通信的开发过程如下面的步骤:(1) 建立一个Socket套接字(2) 按我们所需要的要求配置好Socket套接字,将socket连接到远程server端或者是本机server端或给Socket套接字指定本地协议端口号。(3) 按要求通过Socket套接字发送和接受相应的数据与信息。(4) 完成通信以后我们需要关闭此Socket套接字并且释放相应的其他销耗系统的操作。以上就是通过Socket套接字来实现点对点信息通信的4个编程的核心要点。2.4 系统的选择方案一:红帽子系统即Red Ha系统是目前销售量最高、安装最简便、最适合初学者的Linux发行版,也是目前世界上最流行的Linux发行套件,它的市场营销、包装及服务做的相当不错,自行开发了RPM套件管理程序及X桌面环境Gnome的众多软件并将其源代码回馈给Open Source community。也正是因为Red Hat的方便性,安装程序将系统的构架或软件安装方式全部做了包装,用户学到的都是GUI界面(图形用户界面)上输入一些设置值的粗浅知识,至于软件安装了那些文件、安装到哪个文件目录、系统作了哪些设置,使用者则一无所知,一旦真正遇到系统程序发生问题时,要解决问题也就比较困难。方案二:Caldera OpenLinux系统,Caldera将OpenLinux这套系统定位为容易使用与设置的发行版,以集成使用环境与最终用户办公环境,容易安装使用与简便管理为系统目标,有望成为最流行的公司团体台式Linux操作系统,适合初学者使用,全部安装需要1GB的硬盘空间。Caldera有自行研发的图形界面的安装程序向导,安装过程可以玩俄罗斯方块,提供完整的KDE桌面环境,附赠功能强大的商业软件,如StarOffice、图形界面的硬盘分割工具Partition Magic等。方案三:SuSE Linux系统,SuSE是欧洲最流行的Linux发行版,而且SuSE是软件国际化的先驱,让软件支持各国语系,贡献颇丰,SuSE也是用RPM作为软件安装管理程序,不过SuSE并不适合新手使用,提供了非常多的工具软件,全部安装需4.5GB的硬盘空间,安装过程也较为复杂。通过以上三种方案的比较,考虑适用性,和可操作性,选择Red hat Linux 操作系统。2.5 开发工具的选择方案一:vi编辑器,vi编辑器是Linux上最基本的文本编辑器,它是以字符模式为核心的。由于去除了UI界面,使vi编辑器效率提高了很多。在Linux上也有许多UI界面的编辑器,但VI在系统和服务器管理中的相应的功能是UI编辑器不可以达到的。VI编辑器在Linux上的重要性是与Edit在DOS上的地位是一样。Vi编辑器可以执行文字输出、文字删除、文字查找、文字替换、文件块操作等众多文本操作,用户也可以根据自身的需要对其进行相应的定制和二次开发,这是其他编辑程序所不能达到的效果。加上红帽子系统中自带的gcc编译器和gdb调试工具,所以Linux系统目前最主流的开发工具。方案二:用eclipse 加CDT+GCC+GDB,虽然eclipse 拥有方便的UI界面,配置开发环境有点复杂,如果配置好了,开发的效率还是不错的。和在windows下开发基本相似。用eclipse+CDT可以自动生成makefile文件,比较适合偏爱图形界面的开发人员。通过以上两种方案的比较,考虑适用性,和编程习惯,选择方案一。 2.6 多线程与多进程点对点通信的实现知识,了解了主机进程与服务器进程之间的连接关系,建立连接了一对一的进程联系,即主机的一个进程必须与服务器的一个进程之间建立相应的连接。而对于每一个client端服务器都要建立一个相应的进程去实现和client端的通信。 对于线程的并发情况我们就要建立多个线程去出来。由于服务端接受信息的行为是被动的,当服务端没有信息可以接收时,该进程就应该自动的阻塞,发送任务也应该一起被阻塞。不同端口的收发之间就存在并发情况,这样我们就应该应该建立多个不同的进程去分别完成信息的收发。这样,当一个client端的请求被阻塞时,不至于影响其它的client端的正常工作。关于多进程和多线程,我觉得最核心的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”。方案一:多进程,数据共享非常复杂,需要用IPC处理;数据是分开处理的,同步比较简单;但是内存耗的多,切换相应的会比较复杂,CPU利用率低创建销毁、切换复杂,速度慢;编程简单,调试简单;适应于多核、多机分布式;如果一台机器不够,扩展到多台机器比较简单。方案二:多线程,他的优点在于共享进程间的数据,数据共享就变的十分的简单,并且创建销毁、切换简单,速度很快,缺点也由于这个原因导致同步复杂;虽然占用内存少,切换简单,但是CPU利用率高,编程复杂,调试复杂;一个线程死掉将导致整个进程失去功能,。通过以上两种方案的比较,考虑适用性,选择多线程实现对客户端的监听。2.7 I/O多路复用除了可以采用多进程和多线程方法去实现并发情况之外,还可以采用I/O多路复用这门技术来实现。通过该技术,系统内核首先会缓冲I/O数据,当某个I/O准备好后,系统自动通知相应的应用程序去完成I/O读或写操作,这样应用程序可以迅速的完成对应的I/O操作,因而系统不需要等待完成相应I/O操作,从而应用程序设置阻塞。因此我在收发信息方面使用了I/O多路复用去处理,即在处理群聊私聊的信息传送时。对于client端,一旦我们输入了一行文字发,系统会自动的读取,进而发送给系统内的server端,然后由server端反馈给对应的目标client端。方案一:当我们使用的poll函数返回时,会返回一个文件是读写标志,应用程序根据不同的返回标志去读写相应的文件,实现不用阻塞就可以完成读写。这允许进程来决定那个client端是可读或写一个或多个文件而不用阻塞的。poll返回不同的标志,这些标志告诉主进程文件是否可以读写,其原型(定义在<linuxpoll.h> ):unsigned int (*poll) (struct file *filp, poll_table *wait);实现这个设备的方法分为下面的两步:1. 在一个或多个可指示查询状态变化的等待队列上调用 poll_wait. 当文件描述符不可以可用来执行 I/O时, 内核将使这个进程在处于等待状态,一旦又来可使用的文件描述符时,. 驱动自动的通过调用函数 poll_wait增加一个新的等待队列到 poll_table结构,原型:void poll_wait (struct file *, wait_queue_head_t *, poll_table *);2. 返回一个位掩码:我们在处理某一些功能时不必要阻塞,需要立刻进行的操作,那么我们就需要下面的几个标志(通过<linux/poll.h> 定义)用来指示可能的操作,如表2-1所示:标志 含义 POLLIN 如果设备无阻塞的读,就返回该值 POLLRDNORM 通常的数据已经准备好,可以读了,就返回该值。通常的做法是会返回(POLLLIN|POLLRDNORA) POLLRDBAND 如果可 以从设备读出带外数据,就返回该值,它只可在linux内 核的某些网络代码中使用,通常不用在设备驱动程序中 POLLPRI 如果可 以无阻塞的读取高优先级(带外)数据,就返回该值,返回该值会导致select报告文件发生异常,以为select八带外数据当作异常处理 POLLHUP 当读设 备的进程到达文件尾时,驱动程序必须返回该值,依照select的功能描述,调用select的进程被告知进程时可读的。 POLLERR 如果设 备发生错误,就返回该值。 POLLOUT 如果设备可以无阻塞地些,就返回该值 POLLWRNORM 设备已经准备好,可以写了,就返回该值。通常地做法是(POLLOUT|POLLNORM) POLLWRBAND 于POLLRDBAND类似表2-1 poll函数返回的位掩码及其含义 方案二:select函数:select()函数的接口主要以'fd_set'类型为基础而建立的。'fd_set)是一组文件描述符(fd)的大集合。由于在不同的平台上fd_set类型的长度是不同的,因此规定用一组标准的宏定义来处理此类变量显得尤其重要: fd_set set;FD_ZERO(&set); FD_SET(fd, &set); FD_CLR(fd, &set); FD_ISSET(fd, &set); 在过去,一个fd_set通常是小于32个文件描述符的,因为fd_set其实仅仅使用了一个int的比特矢量来实现它。在大多数情况下系统的责任之一包括检查 fd_set能包括任意值的文件描述符,但是当我们知道我们的文件描述符的多少时你应该检查/修改宏FD_SETSIZE的值。这个值是与系统相关的,同时我们也要检查Linux系统中的自带的select() 的man手册。因为有一些系统对多于1024个文件描述符的fd_set是存在支持的问题的。译者注: Linux就是这样的系统!你会发现sizeof(fd_set)的结果是128(*8 = FD_SETSIZE=1024) 尽管很少你会遇到这种情况。select的基本接口其实是非常的简单的:int select(int nfds, fd_set *readset, fd_set *writeset, fd_set *exceptset, struct timeval *timeout); 其中: nfds 需要检查的文件描述符个数,数值应该比是三组fd_set中最大数 更大,而不是实际文件描述符的总数。readset 用来检查可读性的一组文件描述符。writeset 用来检查可写性的一组文件描述符。exceptset 用来检查意外状态的文件描述符。(注:错误并不是意外状态)timeout NULL指针代表一直等待,否则是指向timeval结构的指针,代表最 长等待时间。(如果其中tv_sec和tv_usec都等于0, 则文件描述符 的状态不被影响,但函数并不挂起) 函数将返回响应操作的总的响应了的描述符,且三组数据均在恰当位置被修改,只有响应操作的那一些没有修改。接着应该用FD_ISSET宏来查找返回的文件描述符组。通过以上两种方案的比较,考虑适用性,选择调用poll函数实现I/O多路复用。 3 系统实现 3.1 Linux提供的有关Socket的系统调用(1) Socket() 作用:socket函数为client端或server端创建一个sokcet套接字格式:int socket(int family,int type,int protocol); 参数说明: family:表示地址族(IP地址),可以去AF_UNLX和AF_INT。其中,AF_UNLX只能够用于UNIX系统进程间通信;AF_INT是可以用于Internet的,因而可以允许在远程主机之间通信,实验中使用AF_INT。 Type:网络程序所采用的通信协议,可以取SOCK_STREAM或SOCK_DGRAM。其中,SOCK_STREAM表明使用的是TCP协议,;SOCKE_DGRAM表明使用的是UDP协议。(2) bind( )格式: int bind(int sockfd,struct sockaddr *addr,int addrlen); 参数说明: Sockfd:socket套接字的的文件描述符。 Sockaddr:IP地址和端口 Addrlen:设置结构大小长度。(3) listen()格式: int listen(int sockfd, int backlog); 作用:监听。 参数说明: Sockfd:表示调用返回的文件描述符。 backlog:表示接入队列允许的连接数目。(4) accept()格式:Int accept (int sockfd, void *addr, int *addrlen); 作用:与listen函数合用,监听信息、接收client端请求。 参数说明:sockfd:表示socket的文件描述符。addr:表示指向局部的数据结构struct sockaddr-in的指针。addrlen:表示地址的长度。(5) connect()格式: int connect( int sockfd , struct sockaddr *serv_addr , int addrlen); 作用:在面向连接的系统中client端连接server端时使用,connect必须在bind后使用。 参数作用: sockfd:表示socket的文件描述符。serv-addr:表示村访目的端口和ip地址(套接字)的数据结构。(6) send() 和 recv() 格式1:int send (int sockfd, const vod *msg,int len, int flags); 功能:发送信息。格式2:int recv (int sockfd , void *buf,int len, usigned int flags); 作用:用于流式socket、数据报socket内部之间的通信。close() 和 shutdown()格式:close( int sockfd) 或int shutdown(int sockfd , int how);参数说明:How的值为下面一种: 0-不允许继续接收; 1-不允许继续发送; 2-不允许继续发送和接收。(7) 有关线程的系统调用函数pthread_create()、pthread_detach()3.2 实验过程说明(使用TCP/IP)(1) 监听连接 利用socket、bind、listen建立连接,步骤是:1) 先用socket函数初始化socket,创建新的sockfd。Sockfd = socket(AF_INT,SOCK_STREAM,0)2) 此步骤涉及到IP地址及其处理过程。参数说明:inet_addr 函数 INADDR_ANY该函数把由小数点分开的十进制IP地址转为unsinged long 类型,而在实验中所使用的为INADDR_ANY,使用利用自已的IP地址自动填充。a) 利用bind函数绑定端口和IP地址。My_addr.sin_family=AF_INET; /*将地址族类型设定好 */My_addr.sin_port=htons(MYPORT); /* 将端口给其赋值*/My_addr.sin_addr.s_addr=INADDR_ANY; /*用连接地址自动填充ip*/Bind(sockfd,(stuct sockaddr*)&my_addr,sizeof(stuct sockaddr);/*sockfd 是分配的socket名字,my-addr则便是分配好的端口与IP,用bind绑定*/b) 利用listen监听请求 (2) 发送请求 1)先用socket函数初始化socket,创建新的sockfd。 2)初始化要连接的服务器地址。 3)利用connect函数将自己的IP地址等信息发送到主机,等待主机调用accept函数来接受请求。(3) 主机接收请求,进行数据通信1)主机利用accept接收请求。2)创建子进程,显示欢迎信息;3)接收返回信息,显示连接成功,并退出连接;4)关闭客户端口socket;3.3系统方案说明 Linux下的聊天软件涉及的一个server端和多个client端.client端向server端发送请求,server端对请求作出响应.client端尝试与server端建立连接.一旦连接建立起来,client端和server端就可以通过socket套节字进行通信.本系统中,主要有两个应用程序,分别为server端程序和client端,client端主要是用于消息转发、客户登陆信息的管理以及向所有用户发送系统消息等。本系统采用C/S(Client/Server)体系结构(见图3-1),即client端/server端体系结构.其特点是client端只装载应用软件,消息处理、用户监控等复杂的处理放在server端中实现,这样就可以大大简化client端的代码,增加了系统的稳定性。 图3-1 C/S体系结构图其大致实现模型是:(1)server端设置一个固定的端口号.一旦server端启动,既使用ListenThread线程对端口进行不间断监听.如果client端请求一个连接,server端使用accept()方法打开一个socket连接.(2)客户在host和port端口建立连接.(3)server端和client端使用InputStream和OutputStream进行通信.3.4结构流程3.4.1. server端结构流程图server端通过socket()系统调用创建一个Socket数组后(即设定了接受连接客户的最大数目),与指定的本地端口绑定bind(),就可以在端口进行listen().如果有client端连接请求,则在数组中选择一个空Socket,将client端地址赋给这个Socket.然后登录成功的客户就可以在server端上聊天了。 图3-2 server端结构流程图 3.4.2客户端结构流程图客户通过Socket套接字建立与server端的连接。server端与客户都通过调用recv()和send()来实现相互的通信,然后双方通过该通信方式来相互传递信息,一旦收到客户方的连接请求,server端accept()方法返回一个新建的Socket对象。客户端然后向server端发送消息,比如聊天等,server端收到来自客户的请求后,针对不同的消息处理请求。 图3-3 客户端结构流程图 3.4.3登录结构流程图用户登录,首先要有一个提供用户登录的存储方式。用户登录的表单应该嵌入整体的结构当中。在实际的应用中,可以这样设计,如果用户没有登录,则在页面中显示用户登录的选项,用户登录后,则可隐藏用户登录的界面,并且显示登陆成功后的其他信息。首先,用户要自己输入用户名和密码。网络聊天需要很高的稳定性和安全性,因此对用户名不允许重复使用。同时对密码也要求保密,将密码加密后再存入数据文件。 图3-4登录结构流程图4 运行效果 (1) 在编写完TCP服务端程序server.c后,编写一个Makefile文件:all:gcc ./cirlist.c *.c -lpthread -Wallrm client.dattouch client.dat执行make。(2) 在编写完TCP客户端程序client.c后,编写一个Makefile文件:all:gcc ./cirlist.c *.c -lpthread -lcrypt执行make。(3) 在主机上打开一窗口,运行server。(4) 再打开另一个窗口,运行client 1001。(5) 再打开另一个窗口,运行client 1002。(6) 再打开另一个窗口,运行client 1003。(7) 输入:【主】# ./a.out(8) 【从】# ./a.out(9) 客户端、server端端窗口之间以及交错发送信息的方式相互发送和接收信息。(10) 客户端登录时若有其他人在线,则可用调整,并按回车选择与其私聊。还可以选择群聊和退出。在私聊中在$FILE$后加文件名可实现文件传输,在$MOON$后加数字(0-9)可发送表情。 开始运行后,客户端1001窗口的执行顺序为:1) 注册;2) 登陆;3) 选中新登陆的好友1002,进行私聊;4) 发送文件hello.txt给客户端1002;5) 输入quit!结束私聊。6) 进入群聊7) 输入quit!结束群聊。8) 注销 开始运行后,客户端1002窗口的执行顺序为:1) 注册;2) 登陆;3) 选中好友1001,进行私聊;4) 接收客户端1001发来的文件 hello.txt;5) 键入quit!结束私聊。6) 进入群聊7) 输入quit!结束群聊。8) 注销 开始运行后,客户端1002窗口的执行顺序为:1) 注册;2) 登陆;3) 进入群聊4) 输入quit!结束群聊。5) 注销运行结果如下。客户端1001输入./a.out进入欢迎界面,如图4-1。 图4-1 1001欢迎窗口按键选中注册,如图4-2。图4-2 1001选中注册按回车键进入注册界面,输入账号密码注册成功,如图4-3。图4-3 1001注册成功 然后退到欢迎界面,回车选择登陆,如图4-4。图4-4 1001登陆成功 登陆成功后,进入如图4-5好友列表界面(其中黑色的杠代表选中的行)。 图4-5 1001好友列表窗口 好友1002登陆成功后,1001的好友列表会自动刷新,如图4-6。 图4-6 1002登陆后1001好友列表窗口 客户端1001和1002分别选中对方,开始私聊,其中包含文件传送和表情发送,如图4-7。 图4-7 客户端1002与1001私聊窗口客户端1001、1002和1003分别选中群聊后,进入群聊窗口,如图4-8。 图4-8 客户端1002、1001和1003群聊窗口 客户端1002接受文件前后文件夹下的文件列表如图4-9所示。 图4-9 客户端1002接收文件前后窗口 使用完毕后,用户还可以注销账户。在欢迎界面点击注销,然后输入账号以及密码即可以实现注销。 图4-10 客户端1001注销成功 上述运行结果表明,client端间的消息收取以及文件传送可以通过server端被对方成功接收,并且成功实现了系统的基本功能,如私聊给功能、群聊功能。对于上下线提醒,我以列表的方式展示出来在线好友即可,没有以打印信息的形式展示将其显示出来。而且成功的实现了client端的注册与注销。 结束语 通过本次对Linux系统的聊天软件的设计,让我在实践中积累总结了不少的经验,锻炼了我的独立分析和实际动手能力,加深了对Linux操作系统和TCP/IP协议的了解提高了对复杂的问题的分析、解决、概括总结的能力,对网络编程项目的开发、设计过程有初步认识。经过近了两周的设计和开发,聊天软件的设计完毕。其功能基本符合课题需求,能够实现基本的网络聊天功能。但是由于课程设计时间较短,还有许多存在不尽如人意的地方,还有待于我们进一步完善。但我从中学到了不少的东西,真正的理解到,理论与实践之间还是有很大的距离,这肯定利于我们以后的工作。这次毕业设计使我明白,在以后的学习工作中,要不断的完善自己的知识体系结构,注意理论和实践的结合,学知识关键在于要学活,而不能死记死搬书本上的知识,关键在于活学活用,这样所学到的东西才是我们自己的东西,才会达到了学习的真正目的! 致谢 短短的设计时间已经结束了,非常感谢指导老师凌云老师的帮助,老师对我们的课程设计特别热心,给予了我们无微不至的帮助。她繁忙的工作中对我的设计提了许多宝贵的建议和意见,使我从对设计课题的茫然到逐渐清晰,最后才使设计得以完成。也很感谢近四年来教我的各科任课老师,是他们丰富我的专业知识,能够运用于设计中。同时也感谢我周围的同学,他们对我的帮助也很多。最后要感谢母校给我提供这么好的学习环境。 敲完最后一个字符,重新从头细细阅读早已不陌生的文字,我感触颇多。虽然其中没有什么值得特别炫耀的成果,但对我而言,是宝贵的。它是无数教诲、关爱和帮助的结果。我要感谢我的指导教师凌云老师 虽身负教学、科研重任,仍抽出时间,不时召集我和同门以督责课业,耳提面命,殷殷之情尽在谆谆教诲中。这篇论文更倾注了她的大量心血。从初稿到定稿,凌云老师不厌其烦,一审再审,大到篇章布局的偏颇,小到语句格式的瑕疵,都一一予以指出。同时,我要感谢电气与信息工程学院所有给我上过课老师,是他们传授给我方方面面的知识,拓宽了我的知识面,培养了我的功底,对论文的完成不无裨益。我还要感谢学院的各位工作人员,他们细致的工作使我和同学们的学习和生活井然有序。谨向我的父母和家人表示诚挚的谢意。他们是我生命中永远的依靠和支持,他们无微不至的关怀,是我前进的动力;他们的殷殷希望,激发我不断前行。没有他们就没有我,我的点滴成就都来自他们。让我依依不舍的还有各位学友、同门和室友。在我需要帮助的时候,同学们伸出温暖的双手,鼎立襄助。能和相遇、相交、相知是人生的一大幸事。本论文的完成远非终点,文中的不足和浅显之处则是我新的征程上一个个新的起点。 参考文献
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸设计 > 任务书类


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!