




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 2014届毕业设计说明书 基于linux操作系统的聊天软件的设计 学 院: 电气与信息工程学院 学生姓名: 指导教师: 职称 讲师 专 业: 电子信息工程 班 级: 电子1002班 完成时间: 2014年5月 摘 要 这篇论文整体是在linux下并通过网络实现类似于qq的的一篇操作报告。开发的框是c/s框架,由server端和client端组成,首先设置好端口参数和ip地址,在编译,调试后实现server端与各个client端的连接,连接后以后server端作为中间端来使客户机实现通讯,因为服务器只存在一个但是客户端存在多个所以我们必须通过链表去管理,client端的信息发送通过封装在soc
2、ket结构体中进行传输。本设计采用tcp/ip协议这样可以保证连接可靠,而且项目管理中釆用linux流行的gcc和makefile编译,大大提高了编译和调试效率,提高了项目完成的效率,但是为了模拟几个client端我们就需要在pc机上再安装一个虚拟系统来操作client端。本次设计的聊天通信使用全双工,主要实现了功能如:用户的帐号与密码的注册与登录,客户点对点聊天,客户之间的群聊,以及文件的发送与接收。测试运行后的可靠性满足linux网络聊天的基本要求。关键词:linux, socket, ,server端,client端,网络编程 abstract this thesis as a whol
3、e 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 ,
4、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 informat
5、ion 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
6、 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:
7、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
8、目 录 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 课题研究的背景及意义随着计算机应用技术的日益普及,网络
9、也遍及到我们生活的每个角落,很好的利用这一资源,将成为我们工作和学习,带来极大的方便。并且可以极高的提高我们的工作效率。所以,各种聊天软件应运而生了。如国外的msn等,国内主要的有腾讯的qq,还有ticq和一些在网页上的即时通讯工具,像chinaren网站上的webmaster等等,都做得即美观又强大,腾讯的qq有非常大的用户群。这些网络聊天软件极大程度上方便了处于在世界各地的友人之间的联系,无论你和亲人、朋友相隔多远,你都可以随时随地和他们交流。并且,你还可以和外国友人交流学习。在网络发展上,最早出现的是分布在很大的地理范围内的远程网络(wideareanetwork,wan),例如美国国防
10、部高级研究计划局首先研制的 arpa 网,它从 1969 年建立,至今已经发展成为跨越几大洲的巨型网络。70 年代中期由于微型计算机的出现和微处理器的出现,以及短程通讯技术的迅猛发展,两者相辅相成,又促进以微机为基础的各种局域网络(local area network,lan)的飞快发展,1975 年美国 xerox 公司首先推出了 ethernet,与此时英国剑桥大学研制成剑桥环网,他们是 lan 的代表。lan 与 wan 有所区别,其特点为:1)有限的地理范围,通常网内的计算机限于一栋大楼,楼群或一个企业及单位。2)较高的通讯速率,大多在每秒 1-100m bps ,而 wan 大多在几
11、十 kbps。3)通讯介质多样。4)通常为一个部门所拥有。特别是 80 年代以来,以微机为基础,lan 技术有了极其迅速的发展。90 年代计算机网络化大趋势尤为明显。具称 1978 年全世界约有 700 万人每天使用计算机,而到 1998 年上升到 5000 万人,目前全世界已经拥有超过一亿台的计算机,预计每天上机人数可达 2 亿以上。计算机的性能价格比以每年 25%的速度在提高。微机的应用已经渗透到国民经济的各个部门,乃至家庭和个人。这标志着正步入信息时代,世界范围内的社会信息数据正在每年增长 40%到 45%的年增长率在增加,这就是迫切实现网络化的动力源泉。据称,约有 65%的计算机要联网
12、或已经联网,以求彼此通信,达到资源共享的目标。90 年代计算机网络化更加向深度和广度方向发展。人们要求网络传输的内容范围增加,诸如数据之外,还需传输声音,图形,图象和文字,这就是以网络为基础的多媒体技术,使网络的应用广度更加扩大,并最终为信息化社会的实现所必须的网络连接奠定基础。当前国际 lan 的市场上,两雄称霸,龙争虎斗的局面,将可能持续相当长一段时间。正如大家知道的那样,80 年代后期美国 novell 公司先是以“一花独秀,压倒群芳”之势占据了国际 lan 市场 60%以上,一路领先,扶摇直上,尤其是 netware 386 v3.11 版推出后,受到普遍的注目;随后,国际上的软件公司
13、龙头老大 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 最大的
14、特点是与其底层的网卡的无关性,即是说 netware 可以虚拟的在所有流行的 lan 上面运行,使它成为一个理想的开发网络应用软件的平台,吸引了广大用户软件人员为之开发越来越多的网络应用软件。反过来又推动其发展,同时 novell lan 采取了开放协议技术(opt),允许各种网络协议紧密结合,进而在 netware 386 v3.11 版中采用了 nlm 模块的组合技术,可以实现异机种联网的难题。此外,novell lan 不需专用服务器,占用工作站内存最小,使用方便,功能强,效率高,兼容性强,可靠性高,保密性强,容错性好。尤其在 netware 386 v3.11版中实现了服务器软件的“分
15、布式结构策略”、“横向信息共享”、“报文传送”技术、增添了“tcp/ip 栈”、实现了“sna 协议”和“开放式数据链路接口”等一系列新技术,使 novelllan 更深入人心,扩大了市场。与此同时,微软的lan manager v2.1和v2.2局域网版除了有一般的基础的优点,还应用了“客户机服务器”(client/server)的强大内网络体系结构,以及基于多用户,多任务并发先进的 os/2 作为服务器,并以 os/2,unix, vms 和 windows nt 作为系统的开发平台,更方便与异类机种访问网络。由于 lan manager与 windows 的联系;使它有更高的的性格比。在
16、网络化技术飞速发展的今天,tcp/ip 协议可谓是立下了汗马功劳。起先,tcp/ip(transmission control protocol/internet protocol)是由美国国防部于 70 年代提出来的,将中大型机连成的网络互连起来,并按 tcp/ip 协议这种模式实现异网之间通讯,接着美国国防部高级计划局(darpa)于 70 年代末提出了几种国际互连(internet)技术。这些技术实现了在科学研究,军事和社会生活迫切需要共享的资料。题1.2 tcp/ip介绍transmission control protocol/internet protocol的简写,中译名为传输控
17、制协议/因特网互联协议,又名网络通讯协议,是internet最基本的协议,internet国际互联网络的基础,由网络层的ip协议和传输层的tcp协议组成。tcp/ip 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求。通俗而言:tcp负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而ip是给因特网的每一台电脑规定一个地址。(1) 协议优势在社会长期的发展过程中,ip逐步取代了其余的网络。这是一个简单的解释。ip传输通用数据。数据能够用于任何目的,并且能够很轻易地
18、取代以前由专有数据网络传输的数据。(2)协议的缺点第一,协议在服务,接口方面的区分不明确。好的软件工程在功能与实现上面是有明确的区分的,tcp/ip没有很好地做到这点。第二,主机-网络层本身并不是实际的一层,它定义了网络层与数据链路层的接口。1.3 linux介绍 linux是一种开源的操作系统,它拥有像windows和mac那样的功能齐全的ui界面(gui,graphical user interface)。linus torvald。作为一种很棒的操作系统,它具有与unix,mac,windows和windows nt相似的的功能,但是其中又会有不同的地方。 提到linux我们一定要知道g
19、nu和unix。richard m.stallman创建的自由软件联盟推出了两种许可证,gnu是通用公共许可证(gnu gneral public license,gpl)和gnu函数库通用公共许可证(gnu library gneral public license,lgpl)。除了一些库是以gnu函数库通用公共许可证发行的,其他基本上gnu工程的软件和文档是以gnu通用公共许可证为基础发布的。按照gnu的相关规定,linux的源代码可以在网上免费自由获取,这一点为我们学习者提供了极大的方便。gpl极大的体现了stallman的思想:只要用户所做的修改是有利于系统发展的,用户可以自由地使用、
20、拷贝、查询、重用、修改也可以发布这个修改后的软件。就这样gpl保证了linux的优点不仅现在自由可用,而且经过修改后的系统都仍然可以自由使用。 unix是由att贝尔实验室的ken thompson和dennis ritchie在已经废弃了的pdp-7上开发的在1969年;刚开始它是一个仅用用汇编语言单编写的一个建议的单用户用户操作系统。后来,又在pdp-11上用c语言重新编写系统,把unix做成为了一个文本处理系统,这样极大的促进了unix在贝尔实验室得的使用。unix的最初版本不收费的供应给众多的大学的计算机系去使用。加州大学伯克利分校的计算机系就是在这众多的大学中,并对unix进行了完善
21、并且增加了许多新的特点,这就是被广大的开发者所熟知的的bsc版本的unix。在这个事间的同时,很多其他的的unix版本也开始萌生。unix不断发展壮大,许多版本被应用到不同类型的的计算机使用。而linux最初就是专门为intel的个人计算机设计的。(1)linux的昨天 1991年,一名叫linus torvalds的芬兰大学生觉得unix各种版本对于一个类型的机器的兼容性比较差(80386类的机器),于是他决定要开发出一个全功能的、并且支持posix标准的、类似于unix的操作系统的系统内核,该系统取得了bsd和system v 的精华,同进去除了它们的糟粕。他将内核开发到了0.02版,这个
22、版本中已经可以运行gcc、bash和其他少量的应用程序。后来他在英特网的帮助下在在1994年将linux升级到1.0版本。它的源代码量也呈指数形式迅速增长,实现了基本的tcp/ip功能,在此同时大约有100000用户开始使用linux操作系统了,linux系统开始被广大的用户所认可。(2) linux的今天 作为服务器级的操作系统,在广大的开发者的共同努力下linux操作系统已经非常成熟了。现在的linux内核集成了150万多行代码,不仅可以作为web服务器平台,而且也为越来越多的用户提供文件和打印服务。它既被当作邮件服务器的一种候选平台,也被当作一种强壮而安全的防火墙。 linux的企业级特
23、性:linux系统不仅支持多处理器、支持大型文件系统、日志文件系统而且在密集型计算和高可用性集群技术上面也逐步成熟。 现在的linux的ui界面也在继续完善。kde桌面提供的图形用户界面在易用性和可配置方面和微软的windows不相上下。(3) linux的明天 linux最强大的生命力在于其开源。每学习者都有可以轻松自由的获取内核源代码,每个人都可以运载源程序并对其加以修改,而后的他人也可以自由获取你修改后的源程序。集市模型就是为linux这种独特的自由流畅的开发模型已被命名。集市模型是通过重视实验征集和充分利用早期的反馈,通过平衡的配置脑力资源,从而开发出更优秀的软件。 1.4 本文的研究
24、内容本课题的任务是设计一个支持多人群聊以及用户间私聊和文件传送的聊天系统。首先服务器会初始化,然后等待客户端的连接。每连接一个客户端就简历一个线程去监听客户端请求。客户端是注册好了的,只需要登陆。客户端注册成功会把客户端信息保存到链表和文件中。注销时会把对应的链表节点销毁,并且删除文件对应信息。当有多个客户端登陆时,客户端界面会显示其他用户的用户名。可以实现用键选择,然后按回车键进入与其的私聊界面。然后可以和其进行私聊和文件传送。而好友界面的倒数第二个为群聊选择,当进入群聊时,可以实现多人同时聊天。另外,如果其他人下线时。你的显示好友界面里的那个客户端就会消失,同时,有人上线时,会在好友栏加上
25、新加的客户端。最后一个选项是退出,销毁对应线程及文件描述符。 2 技术说明与方案选择 2.1 通信方式2.1.1 udp通信 udp是用户数据报协议的简称。udp在传送数据之前不需要先建立连接,远地主机的传输层在收到udp数据后,不能给出任何确认信息,所以不能保证其交付时信息的可靠性。它的特点是:无连接,不能提供的可靠的信道,但正是因为无连接这个特点使udp具有很好的传输效率。2.1.2 tcp通信 tcp是传输控制协议的简称,tcp可以提供一条全双工的、可靠的信道。tcp在数据传送之前必须先建立相应的连接,数据传送完成后必须释放连接。但是tcp不能提供广播和多播这些信息服务。 正是因为tcp
26、要提供可靠的、面向连接的运输等多样的服务,所以增加了额外的系统开销,例如确认、流量的控制、计时器以及连接管理等服务都需要消耗许多系统资源。 如果计算机之间使用通信方式是tcp通信,则计算机之间的连接过程需要三次握手实现,如下图1-1所示。 图1-1 用三次握手建立tcp连接 对于计算机连接的释放过程也需要类似的3次握手的互相确认的过程,如实验图1-2所示。 图1-2 tcp连接的释放过程通过以上两种方案的比较,考虑适用性,本次课题我选择了选择tcp通信协议。2.2 c/s模型c/s模型将应用程序分为server端和client端两基本的部分,client端对server端发送请求,server
27、端对其作出相应的回应并开始提供服务。在tcp/ip应用中,多数网络应用程序是使用c/s模型设计的。server端一直处于等待状态,当一个client端提出请求时。server端马上会根据client端发送的请求从而执行对应操作以至于达到server端的要求。通常,c/s模型必须包含两个独立的应用程序:client端和server端的应用程序。在c/s模型中,多个在同样的内网中的计算机都作为client端,与端口号和ip进行连接,并通过server端传递信息。所以client端的通信既可以理解为client端和server端之间的通信。所以采用c/s模型进行网络聊天系统的设计需要分别编写clie
28、nt端和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套接字发
29、送和接受相应的数据与信息。(4) 完成通信以后我们需要关闭此socket套接字并且释放相应的其他销耗系统的操作。以上就是通过socket套接字来实现点对点信息通信的4个编程的核心要点。2.4 系统的选择方案一:红帽子系统即red ha系统是目前销售量最高、安装最简便、最适合初学者的linux发行版,也是目前世界上最流行的linux发行套件,它的市场营销、包装及服务做的相当不错,自行开发了rpm套件管理程序及x桌面环境gnome的众多软件并将其源代码回馈给open source community。也正是因为red hat的方便性,安装程序将系统的构架或软件安装方式全部做了包装,用户学到的都是g
30、ui界面(图形用户界面)上输入一些设置值的粗浅知识,至于软件安装了那些文件、安装到哪个文件目录、系统作了哪些设置,使用者则一无所知,一旦真正遇到系统程序发生问题时,要解决问题也就比较困难。方案二:caldera openlinux系统,caldera将openlinux这套系统定位为容易使用与设置的发行版,以集成使用环境与最终用户办公环境,容易安装使用与简便管理为系统目标,有望成为最流行的公司团体台式linux操作系统,适合初学者使用,全部安装需要1gb的硬盘空间。caldera有自行研发的图形界面的安装程序向导,安装过程可以玩俄罗斯方块,提供完整的kde桌面环境,附赠功能强大的商业软件,如s
31、taroffice、图形界面的硬盘分割工具partition magic等。方案三:suse linux系统,suse是欧洲最流行的linux发行版,而且suse是软件国际化的先驱,让软件支持各国语系,贡献颇丰,suse也是用rpm作为软件安装管理程序,不过suse并不适合新手使用,提供了非常多的工具软件,全部安装需4.5gb的硬盘空间,安装过程也较为复杂。通过以上三种方案的比较,考虑适用性,和可操作性,选择red hat linux 操作系统。2.5 开发工具的选择方案一:vi编辑器,vi编辑器是linux上最基本的文本编辑器,它是以字符模式为核心的。由于去除了ui界面,使vi编辑器效率提高
32、了很多。在linux上也有许多ui界面的编辑器,但vi在系统和服务器管理中的相应的功能是ui编辑器不可以达到的。vi编辑器在linux上的重要性是与edit在dos上的地位是一样。vi编辑器可以执行文字输出、文字删除、文字查找、文字替换、文件块操作等众多文本操作,用户也可以根据自身的需要对其进行相应的定制和二次开发,这是其他编辑程序所不能达到的效果。加上红帽子系统中自带的gcc编译器和gdb调试工具,所以linux系统目前最主流的开发工具。方案二:用eclipse 加cdt+gcc+gdb,虽然eclipse 拥有方便的ui界面,配置开发环境有点复杂,如果配置好了,开发的效率还是不错的。和在w
33、indows下开发基本相似。用eclipse+cdt可以自动生成makefile文件,比较适合偏爱图形界面的开发人员。通过以上两种方案的比较,考虑适用性,和编程习惯,选择方案一。 2.6 多线程与多进程点对点通信的实现知识,了解了主机进程与服务器进程之间的连接关系,建立连接了一对一的进程联系,即主机的一个进程必须与服务器的一个进程之间建立相应的连接。而对于每一个client端服务器都要建立一个相应的进程去实现和client端的通信。 对于线程的并发情况我们就要建立多个线程去出来。由于服务端接受信息的行为是被动的,当服务端没有信息可以接收时,该进程就应该自动的阻塞,发送任务也应该一起被阻塞。不同
34、端口的收发之间就存在并发情况,这样我们就应该应该建立多个不同的进程去分别完成信息的收发。这样,当一个client端的请求被阻塞时,不至于影响其它的client端的正常工作。关于多进程和多线程,我觉得最核心的一句话是“进程是资源分配的最小单位,线程是cpu调度的最小单位”。方案一:多进程,数据共享非常复杂,需要用ipc处理;数据是分开处理的,同步比较简单;但是内存耗的多,切换相应的会比较复杂,cpu利用率低创建销毁、切换复杂,速度慢;编程简单,调试简单;适应于多核、多机分布式;如果一台机器不够,扩展到多台机器比较简单。方案二:多线程,他的优点在于共享进程间的数据,数据共享就变的十分的简单,并且创
35、建销毁、切换简单,速度很快,缺点也由于这个原因导致同步复杂;虽然占用内存少,切换简单,但是cpu利用率高,编程复杂,调试复杂;一个线程死掉将导致整个进程失去功能,。通过以上两种方案的比较,考虑适用性,选择多线程实现对客户端的监听。2.7 i/o多路复用除了可以采用多进程和多线程方法去实现并发情况之外,还可以采用i/o多路复用这门技术来实现。通过该技术,系统内核首先会缓冲i/o数据,当某个i/o准备好后,系统自动通知相应的应用程序去完成i/o读或写操作,这样应用程序可以迅速的完成对应的i/o操作,因而系统不需要等待完成相应i/o操作,从而应用程序设置阻塞。因此我在收发信息方面使用了i/o多路复用
36、去处理,即在处理群聊私聊的信息传送时。对于client端,一旦我们输入了一行文字发,系统会自动的读取,进而发送给系统内的server端,然后由server端反馈给对应的目标client端。方案一:当我们使用的poll函数返回时,会返回一个文件是读写标志,应用程序根据不同的返回标志去读写相应的文件,实现不用阻塞就可以完成读写。这允许进程来决定那个client端是可读或写一个或多个文件而不用阻塞的。poll返回不同的标志,这些标志告诉主进程文件是否可以读写,其原型(定义在 ):unsigned int (*poll) (struct file *filp, poll_table *wait);实现
37、这个设备的方法分为下面的两步:1. 在一个或多个可指示查询状态变化的等待队列上调用 poll_wait. 当文件描述符不可以可用来执行 i/o时, 内核将使这个进程在处于等待状态,一旦又来可使用的文件描述符时,. 驱动自动的通过调用函数 poll_wait增加一个新的等待队列到 poll_table结构,原型:void poll_wait (struct file *, wait_queue_head_t *, poll_table *);2. 返回一个位掩码:我们在处理某一些功能时不必要阻塞,需要立刻进行的操作,那么我们就需要下面的几个标志(通过 定义)用来指示可能的操作,如表2-1所示:标
38、志 含义 pollin 如果设备无阻塞的读,就返回该值 pollrdnorm 通常的数据已经准备好,可以读了,就返回该值。通常的做法是会返回(polllin|pollrdnora) pollrdband 如果可 以从设备读出带外数据,就返回该值,它只可在linux内 核的某些网络代码中使用,通常不用在设备驱动程序中 pollpri 如果可 以无阻塞的读取高优先级(带外)数据,就返回该值,返回该值会导致select报告文件发生异常,以为select八带外数据当作异常处理 pollhup 当读设 备的进程到达文件尾时,驱动程序必须返回该值,依照select的功能描述,调用select的进程被告知进
39、程时可读的。 pollerr 如果设 备发生错误,就返回该值。 pollout 如果设备可以无阻塞地些,就返回该值 pollwrnorm 设备已经准备好,可以写了,就返回该值。通常地做法是(pollout|pollnorm) pollwrband 于pollrdband类似表2-1 poll函数返回的位掩码及其含义 方案二:select函数:select()函数的接口主要以fd_set类型为基础而建立的。fd_set)是一组文件描述符(fd)的大集合。由于在不同的平台上fd_set类型的长度是不同的,因此规定用一组标准的宏定义来处理此类变量显得尤其重要: fd_set set;fd_zero(
40、&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就是这样的系统
41、!你会发现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
42、 用来检查意外状态的文件描述符。(注:错误并不是意外状态)timeout null指针代表一直等待,否则是指向timeval结构的指针,代表最 长等待时间。(如果其中tv_sec和tv_usec都等于0, 则文件描述符 的状态不被影响,但函数并不挂起) 函数将返回响应操作的总的响应了的描述符,且三组数据均在恰当位置被修改,只有响应操作的那一些没有修改。接着应该用fd_isset宏来查找返回的文件描述符组。通过以上两种方案的比较,考虑适用性,选择调用poll函数实现i/o多路复用。 3 系统实现 3.1 linux提供的有关socket的系统调用(1) socket() 作用:socket函数为
43、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(
44、 )格式: 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)
45、; 作用:与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:表示村访目的端口和
46、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-不
47、允许继续接收; 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 类型,而在实验中所
48、使用的为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绑定*
49、/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端尝试
50、与server端建立连接.一旦连接建立起来,client端和server端就可以通过socket套节字进行通信.本系统中,主要有两个应用程序,分别为server端程序和client端,client端主要是用于消息转发、客户登陆信息的管理以及向所有用户发送系统消息等。本系统采用c/s(client/server)体系结构(见图3-1),即client端/server端体系结构.其特点是client端只装载应用软件,消息处理、用户监控等复杂的处理放在server端中实现,这样就可以大大简化client端的代码,增加了系统的稳定性。 图3-1 c/s体系结构图其大致实现模型是:(1)server端设
51、置一个固定的端口号.一旦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端连接请求,则在数组
52、中选择一个空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登录结构流程
53、图用户登录,首先要有一个提供用户登录的存储方式。用户登录的表单应该嵌入整体的结构当中。在实际的应用中,可以这样设计,如果用户没有登录,则在页面中显示用户登录的选项,用户登录后,则可隐藏用户登录的界面,并且显示登陆成功后的其他信息。首先,用户要自己输入用户名和密码。网络聊天需要很高的稳定性和安全性,因此对用户名不允许重复使用。同时对密码也要求保密,将密码加密后再存入数据文件。 图3-4登录结构流程图4 运行效果 (1) 在编写完tcp服务端程序server.c后,编写一个makefile文件:all:gcc ./cirlist.c *.c -lpthread -wallrm client.dat
54、touch 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) 客户端
55、登录时若有其他人在线,则可用调整,并按回车选择与其私聊。还可以选择群聊和退出。在私聊中在$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)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 特殊学校用具管理制度
- 玛纳斯镇机关管理制度
- 环保农药使用管理制度
- 现场安全秩序管理制度
- 现金收款收据管理制度
- 班组岗位安全管理制度
- 理疗店铺运营管理制度
- 生产企业厂务管理制度
- 生产现场钥匙管理制度
- 生产职工考勤管理制度
- 第五单元《面积》(教学设计)-【大单元教学】三年级数学下册同步备课系列(人教版)
- 掼蛋考试试题及答案
- GA/T 2159-2024法庭科学资金数据清洗规程
- 企业风险管理-战略与绩效整合(中文版-雷泽佳译)
- 业务学习踝关节骨折
- 实景演出制作合同协议
- 迅镭激光切割机操作培训
- 《医疗机构重大事故隐患判定清单(试行)》知识培训
- 浙江省杭州市2024年中考英语真题(含答案)
- 《陆上风电场工程设计概算编制规定及费用标准》(NB-T 31011-2019)
- 装修管理规则-城市综合体---成都租户指引
评论
0/150
提交评论