基于Linux网络聊天室的设计正文.doc_第1页
基于Linux网络聊天室的设计正文.doc_第2页
基于Linux网络聊天室的设计正文.doc_第3页
基于Linux网络聊天室的设计正文.doc_第4页
基于Linux网络聊天室的设计正文.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 引言1.1 课程设计目的近年来,随着全球信息化进程的不断发展,网络也在飞速发展。出于高效、快速地处理各种事务的目的,越来越多的企业在其内部使用局域网来进行工作。在内部局域网的帮助下,企业得以简化信息流程,提高信息交换的速度,从而提高工作效率。然而,随着企业规模的扩大,业务量的增加,在局域网上运行的应用越来越多,如知识库、网络会议、数据库应用和数据的同步与备份等,这些应用对局域网的信息吞吐、处理能力的要求也越来越高。这些在企业内部原有局域网设计之初未曾考虑到的新情况的出现使得局域网不堪重负,容易发生信息阻塞,此时,局域网不但不能提高生产效率,反而成为企业发展的瓶颈。为了解决上述矛盾,人们提出了许多方法。提升网络带宽及增加服务器的吞吐能力是解决此矛盾的一种方法。然而,从企业运行的成本方面考虑,无论是单纯地提升网络带宽或增加服务器的吞吐能力都不能从根本上解决局域网资源紧张的问题,对旧有局域网的大规模硬件改造反而会增加企业的负担。我们在本文中将讨论一种基于Socket的局域网通信方法。基于Socket的局域网通信软件可以为企业原有的局域网提供一种良好,安全,快速的通信机制。它可以在BSD、AIX、Solaris、MicrosoftWindows、MACOS及Linux等多种操作系统上实现,并且它的实现无需对企业原有的局域网硬件进行任何改动,具有实现成本低廉的优点,它的使用能有效地降低局域网通信负荷,提高局域网的使用效率,可以很好地解决企业内部局域网的各种通信需求。基于Socket的局域网聊天室是此类局域网通信软件的具体实例之一,它很好地诠释了Socket通信的原理,并且在企业内部通信、教学、讨论等应用中都具有一定的实用价值。它具有信息收发速度快,保密性好,占用网络带宽资源低,占用服务器吞吐能力低,易于编程实现等优点。基于Socket的局域网通信软件应用范围广阔,不但可以处理传统的通信需求,而且也能适应新型的网络应用,如即时通讯,网络教育,数据影音传输等,拥有广泛的应用前景。网络的发展日新月异,它的兴起也给人们的生活带来了巨大的影响。网络的应用也几乎是涉及到社会的方方面面,因此网络的重要性不言而喻。而学习网络知识,熟悉网络运用对于生活在这个信息社会的我们来说也是非常必要的。本课程设计就是对计算机网络应用的一个尝试,其目的主要是熟悉网络通信的基本方法,了解Socket面向连接通信的主要特点和其一般的编程方法。我们知道,Linux可以说是一个伴随网络而发展起来的操作系统,它的发展也给计算机网络带来了不可估量的作用。本次课程设计选择在Linux下进行开发,一方面是为了突出Linux系统在网络应用方面的先天性优势,另一方面也是为了今后进一步学习Linux操作系统打下一个基础。语言开发工具方面选择了具有网络开发优势的Java程序设计语言,因为Java是新一代的计算机高级语言,它充分借鉴了C+等一些较成功的计算机语言的优点,并去掉了一些相对麻烦、晦涩的语法规则,再加上自己的一些特性,使计算机程序设计变得简单而又高效,尤其是在Internet开发上的应用更是Java语言的优势所在。选择Java作为此次课程设计的开发工具是为了简化Socket编程的步骤,让我能更好地在全局上而不是细节方面把握程序的走向。另外由于Java是跨平台的计算机语言,它的这一特性能够使一次编写的程序无需重新编译就能在几乎是各种平台上很好地运行,这也就免除了系统移植的麻烦。这也是此次课程设计的目的的在,还有就是进一步地熟悉Java语言在网络编程方面的特点,了解服务器端和客户端编程的相同和不同之处,另外在程序设计中运用到了多线程的技术,有效地解决了服务器对多客户端及时响应的问题,研究多线程在程序设计方面的运用也是本次课程设计的目的之一。1.2 课程设计内容本次课程设计是一次程序设计的课题,自然主要就是代码的编写了。而程序设计的方法也对编程的效率有一定的影响。与以往程序设计不同的是此次编程涉及到网络方面的相关知识,因为这里有多端的关系,也就是说该系统将会同时在不同的机器上运行,如何确保它们工作的一致性以及稳定性就成了必须要解决的问题。在传统的程序设计方法中主要有两种方式:结构化程序设计和面向对象程序设计。结构化程序的概念首先是从以往编程过程中无限制地使用转移语句而提出的。转移语句可以使程序的控制流程强制性的转向程序的任一处,在传统流程图中,就是用上节我们提到的很随意的流程线来描述这种转移功能。如果一个程序中多处出现这种转移情况,将会导致程序流程无序可寻,程序结构杂乱无章,这样的程序是令人难以理解和接受的,并且容易出错。尤其是在实际软件产品的开发中,更多的追求软件的可读性和可修改性,象这种结构和风格的程序是不允许出现的。比如:C,FORTRAN,PASCAL等等。结构化程序设计方法主要由以下三种逻辑结构组成: 1)顺序结构:顺序结构是一种线性、有序的结构,它依次执行各语句模块。 2)循环结构:循环结构是重复执行一个或几个模块,直到满足某一条件为止。 3)选择结构:选择结构是根据条件成立与否选择程序执行的通路。 采用结构化程序设计方法,程序结构清晰,易于阅读、测试、排错和修改。由于每个模块执行单一功能,模块间联系较少,使程序编制比过去更简单,程序更可靠,而且增加了可维护性,每个模块可以独立编制、测试。面向对象程序语言中支持的对象具有三个明显得特征:封装、继承、多态;而Javascript在类别和副本上并没有明显地分界。事实上,Javascript语言中所有的变量数据类型在JS中都是对象。JS总共支持4种对象:内置对象、自定义对象、浏览器程序对象和ActiveX对象。 return this只是返回该对象,以便别处引用,但并不是多出一个对象。所以,面向过程的程序设计中:程序=算法+数据结构 数据结构和算法相分离的,所以,系统庞大后,它的控制、移植、重用就成了问题。 而在面向对象的程序设计中: 对象=数据结构+算法 程序=对象+对象+. 所以克服了面向过程的设计中存在的问题。 1.3 linux介绍 Linux是一种针对PC计算机和工作站的操作系统,它具有像Windows和Mac那样的功能齐全的图形用户界面(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于1969年在一台已经废弃了的PDP-7上开发的;最初它是一个用汇编语言写成的单用户操作系统。后来,他们又在PDP-11上用C语言重新编写(发明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功能,此时Linux已经拥有大约10万的用户。(2) Linux的今天 作为一各服务器级的操作系统,Linux已经成熟了。现在的Linux内核由150多行代码组成,能作为Web服务器平台,也为越来越多的商业用户提供文件和打印服务。它既被当作邮件服务器的一种候选平台,也被当作一种强壮而安全的防火墙。 Linux的企业级特性,比如支持多处理器、支持大型文件系统、日志文件系统以及密集型计算和高可用性集群技术,也逐步成熟。 桌面上的Linux也在继续完善。KDE桌面提供的图形用户界面在易用性和可配置方面都能和微软的Windows相媲美。(3) Linux的明天 Linux最强大的生命力在于其公开的开发过程。每个人都有可以自由获取内核源程序,每个人都有要不得以运载源程序加以修改,而后他人也可以自由获取你修改后的源程序。Linux这种独特的自由流畅的开发模型已被命名为bazaar(集市模型)。Bazaar开发模型通过重视实验,征集并充分利用早期的反馈,对巨大数量的脑力资源进行平衡配置,可以开发出更优秀的软件。本联盟就是想通过bazaar开发模型,在网上召集一些Linux的爱好者,开发出更优秀的操作系统或软件。 2 相关技术介绍2.1 TCP和UDP UDP通信 UDP是用户数据报协议的简称。它是以中午连接的逻辑通信信道。UDP在传送数据之前不需要先建立连接,远地主机的传输层在收到udp数据报后,不需要给出任何确认,所以不能保证其交付时可靠。它的特点是:因无连接,故提供的是不可靠的信道,但也是因无连接而具有很好的传输效率。TCP通信 TCP是传输控制协议的简称,它是提供一条全双工的、可靠的信道。TCP提供面向连接的服务,在传送数据之前必须先建立连接,数据传送结束后要释放连接。TCP不提供广播和多播服务。 由于TCP要提供可靠的、面向连接的运输服务,所以不可避免地增加了许多系统开销,比如确认、流量控制、计时器以及连接管理等都需要占用许多系统的时空资源。 两个计算机之间如果使用TCP通信,其连接过程需要三次握手实现,如实验图2.1所示。图2.1 用三次握手建立TCP连接 对于两个计算机之间连接的释放过程也需要类似的3次握手的互相确认的过程,如实验图2.2所示。图2.2 TCP连接的释放过程2.2客户/服务器模型在客户/服务器模型中,多个相互通信的计算机都作为客户端,与网络服务器进行连接,并通过服务器进行信息的传递。所以多个客户端之间的通信就变为了客户端与服务端的通信。所以,采用客户/服务器模型进行网络聊天需要分别编写服务器端和客户端的程序,服务器和客户端之间相互通信的同步关系和各自的程序流程如实验图2.3所示。图2.3 Socket通信流程图2.3网络套接字Socket接口上TCP/IP网络应用程序接口(API),它提供了许多函数和例程,程序员可以使用它们来开发TCP/IP网络应用程序。使用Socket接口进行网络通信的过程如图2.3所示,简要步骤如下:(1) 建立一个Socket.(2) 按要求配置socket,将socket连接到远程主机或给socket指定以各本地协议端口。(3) 按要求通过socket发送和接受数据。(4) 关闭此socket。这是通过Socket实现点对点通信需要掌握的4个编程要点。2.4多线程上述点对点通信的实现知识完成了主机进程与服务器进程之间的连接,建立连接的进程之间是一对一的联系,即主机的一个进程与服务器的一个进程之间建立的连接。而每个进程进行通信的环节都包括了发送信息和接口信息两个任务,这两个任务通过一个端口地址发送和接收。 对于多个并发的任务需要创建多个线程或线程去实现。使用一个进程去完成发送信息是没有问题的,因为发送总是主动的;而使用同一个进程再去完成接受信息去不一定会成功,因为接受信息是被动的,所以当没有信息可以接收时,该进程就会被阻塞,从而导致发送任务也一起被阻塞。同一个端口的发送和接收是两个并发任务,应该由两个不同的任务去分别完成信息的发送和接收。这样,当接收信息任务因没有信息而被阻塞时,不至于影响发送任务的执行。那么,发送和接收两个任务是使用两个进程还是两个进程去完成呢?在网络通信中,端口地址是以进程为单位进程分配的,而一个进程与外界的消息发送与接收必须通过分配给它的同一个端口进行。因此,不能通过创建进程方式来解决上诉问题,因为两个进程会分别对应两个不同的端口,而发送和接收必须使用同一端口。线程不是资源分配的单位,所以如果使用两个线程不会对线程分配新的端口。因此,本实验需要使用两个线程去分别完成发送和接收信息的任务,这两个线程共享其进程拥有的统一个端口地址。由于创建进程的进程本身会作为一个线程来调度,所以只需要再创建一个线程专门负责接收信息就可以了。因此,对于从每个客户端发来的请求,服务器端都要创建相应的线程去接收并处理;同理,对于客户端而言,也要创建一个线程去读取服务器端发来的信息3 系统分析3.1 功能分析因为是聊天室,所以主要功能当然是完成多客户端间的文字信息的传递。因为是基于Socket的网络程序设计,且是面向连接的,因此每个客户端都需要一个服务器来保持这个连接。所以在程序设计时,分为两个部分来讨论,一个是服务器端,另一个就是我们的客户端。服务器端:一般来说,服务器端是整个聊天室最为重要的部分,同时也是式作最为繁忙的部分。客户端工作前,它必有要先工作,部分客户端下线后,它还是要继续工作以保证剩余的部分没有下线的客户端和有可能新上线的客户端的正常工作。同是它还要负责对每个客户端发来的信息进行接收,并判断信息的发送者,以及信息的接受对象,并把它按相应的要求发送出去。一旦服务器端出现问题则很可能所要导致整个聊天室罢工。所以为了保证整个系统的稳定性,服务器端的功能应尽量简单。监听端口:服务器端一个重要功能就是创建监听端口,它必须时刻能够响应到来的客户端的连接请求。创建连接线程:当一个客户端的请求被通过以后就必须要为它创建一个相应的线程来完成与客户端的信息传递。轮询连接列表:当有多个客户端连接到服务器上时,就会存在多个相应的连接线程,把它们用一个列表保存起来方便统一维护。系统必须不断地循环检查这个列表当中的每一个连接,看它们是否有信息传递请求,以做出及时地响应。接受信息:当检测到有连接线程有信息发送请求时,服务器必须做出及时响应将信息接收过来。发送信息:根据信息传送者的意图将信息转发出去。客户端:相对于服务器端来说,客户端的功能就较为简单了。因为服务器是一对多,而客户端则是一对一的关系,因为对于客户端来说,只要是获得了一个连接就可以假设服务器端有一个相应的程序与它完成信息的通信。接受信息:接收从服务器端发来的信息并把它显示在相应的窗口。发送信息:将用户输入的信息采集并向服务器发送。3.2可行性分析计算机网络是由一系列网络通信协议组成的,其中的核心协议是传输层的TCP/IP和UDP协议。TCP是面向连接的,通信双方保持一条通路,就好比目前的电话线,使用telnet登录BBS,用的就是TCP协议;UDP是无连接的,通信双方都不保持对方的状态,浏览器访问Internet时使用的HTTP协议就是基于UDP协议的3。TCP和UDP协议都非常复杂,尤其是TCP协议,为了保证网络传输的正确性和有效性,必须进行一系列复杂的纠错和排序等处理。 UDP和TCP都是基于TCP/IP体系结构的协议。UDP是一种面向无连接、不可靠的协议,在传输前不需要建立连接。远程主机接到UDP数据报后,不需要给出任何应答。它传送的数据包是独立的,前后无任何顺序关系。TCP则是提供面向连接、可靠的服务,在传送数据前两台主机需要进行“三次握手”。在建立连接之后才能传送数据,TCP提供可靠服务,因此不可避免地增加了一些开销,如应答、流量控制、定时以及连接管理等。虽然UDP协议在可靠性方面不如TCP协议,但效率却比TCP高,当每次传送的数据量很少而且网络质量较高时,UDP也同样可以达到实用的可靠性要求。在Internet(广域网)和Intranet(局域网)上的通信程序一般都是以服务器提供服务端连接响应,使用者通过客户端程序登录到服务器,就可以与登录在同一服务器上的用户交谈,这是一个面向连接的通信过程。因此,程序要在TCP/IP环境下,实现服务器端和客户端两部分程序(Client和Server)。在TCP/IP网络应用中,通信的两个进程相互作用的主要模式是客户机/服务器模式,即客户端向服务器发出请求,服务器接收到请求后提供相应的服务。客户机/服务器模式的建立基于以下两点:首先,建立网络的起因是网络中软、硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用。其次,网络之间进的程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立一种联系,为二者的数据交换提供同步,这就是基于客户机/服务器模式的TCP/IP。 客户机/服务器模式在操作过程中采取的是主动请求方式: 首先服务器方要启动,并根据请求提供相应服务: 1、打开一个通信通道并告知本地主机,它愿意在某一公认地址端口上(周知口,如http为80)接受客户请求。 2、等待客户请求到达该端口。 3、接收到重复服务请求,处理该请求并发送应答信号。接收并发服务请求,要激活一新线程来处理这个客户请求。新进程处理此客户请求,并不需要对其他请求做出应答。服务完成后,关闭此新进程与客户的通信链路,并终止。4、返回第二步,等待另外的客户请求5、关闭服务器。客户方: 1、打开一个通信通道,并连接到服务器所在主机的特定端口。2、向服务器发出服务请求报文,等待并接收应答;继续提出请求。 3、请求结束后关闭通信通道并终止。 3.3 性能分析因为是聊天室程序,涉及到一台服务器多个客户端的问题,理论上是客户端的数目是没有限制的,但是实际上计算机的任何资源都是有限的,当资源不足时就可能会出现系统性能显著下降的情况,这个时候系统性能就成了十分严重的问题。虽然这次课程设计不能与专业的应用软件相比,但在作分析时还是应当向着专业的方向去思考问题。要解决这个问题有很多种方法,最容易想到的一种那就是用队列的方法,对请求连接的客户端进行排队,一个接着一个地来处理,这样就可以保证服务器不出现资源冲突的现象。不过这是以牺牲系统的反应灵敏度为代价的。这意味着当有很多人在请求连接时你就很可能需要等很长的一段时间才能有服务器发回来的响应。这势必就造成了使用者失去使用该系统的耐心。另一个方法就是使用多个进程,每来一个用户连接请求就为其创建一个独立的进程,因为进程间以时间片间隔交换执行这样在一段时间内每个连接都能够得到响应,这就提高了整个系统的反应能力。不过进程间的切换却成了最为头疼的问题,因为进程间的切换要对先前进程的各种状态信息进行保存以便下次恢复使用。这种耗费系统时间的系统损失是让人无法接受的。因此这一种方案也是不可取的。综上所述,多线程似乎是最为合理的选择。因为线程间的切换不需要对上下文进行保存,这就在时间上提高了系统的性能。本次聊天室的程序设计正是使用了多线程的技术,当客户端发起连接请求时服务器就为之创建相应的进程,这样既提高的系统的反应能力又不会造成太大的时间浪费,是一个较为适中的选择。4 系统实现4.1 总体架构设计因为整个系统是基于Socket且是而向连接的,因此在进行系统总体架构分析前有必要对TCP连接的建立做一个简单的介绍。TCP的连接是通过三次握手实现的,如图4.1所示。socket()bind()listen()accept()TCP服务器指定的端口一直阻塞到客户连接到达read()处理请求write()read()close()socket()connect()write()read()close()TCP客户建立连接(TCP)三路握手数据(请求)数据(应答)文件通知结束图4.1 TCP的三次握手整个系统的基本架构也并不复杂,由服务器和客户端两个部分组成,如图4.2所示。服务器端又由两个部分组成,一个Loop而另一部分则是Socket。其中Loop是一个循环线程,在程序中的角色就是一个高度者,它负责消息的监听,负责消息的转发。而另一部分Socket主要就是与客户端的进程相对应,从图中可以很清楚地看出来,每一个Socket都对就一个Client,也就是就当客户端一旦申请连接通过以后,服务器端就会立即为它创建一个相关的线程也就是Socket线程与它对应,真正消息的传递也是在Socket和Client之间进行的。服务器端Socket 1Socket 2Socket 3Socket 4Socket nClient 1Client 2Client 3Client 4Client nLoop客户端图4.2 TCP服务器与客户端连接框架4.2 Linux提供的有关Socket的系统调用(1) Socket() 作用:socket函数为客户机或服务器创建一个sokcet格式:int socket(int family,int type,int protocol); 参数说明: Family:表示地址族,可以去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); 作用:监听连接信号,和accepted函数合同。 参数说明: Sockfd:表示socket调用返回的文件描述符。 Backlog:表示接入队列允许的连接数目,大多数系统允许20个,也可以子定义510个。(4) accept() 格式: Int accept (int sockfd, void *addr, int *addrlen); 作用:与listen函数合用,监听信息、接收客户端请求。 参数说明: Sockfd:表示socket的文件描述符。 Addr:表示指向局部的数据结构struct sockaddr-in的指针。 Addrlen:表示地址的长度。(5) connect()格式: int connect( int sockfd , struct sockaddr *serv_addr , int addrlen); 作用:在面向连接的系统中客户及连接服务器时使用,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内部之间的通信。(7) close( ) 和 shutdown ( )格式: Close( int sockfd)或 Int shutdown(int sockfd , int how); 参数说明: How的值为下面一种: 0-不允许继续接收; 1-不允许继续发送; 2-不允许继续发送和接收。(8) 有关线程的系统调用函数pthread_create()、pthread_join()4.3 实验过程说明(使用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)利用gethostbyname获取主机信息。2)初始化socket端口。3)利用connect函数将自己的IP地址等信息发送到主机,等待主机调用accept函数来接受请求。(3) 主机接收请求,进行数据通信1)主机利用accept接收请求。2)创建子进程,显示欢迎信息;3)接收返回信息,显示连接成功,并推出连接;4)关闭客户端口socket;5)关闭服务端socket,结束子线程。 5 聊天室功能测试(1) 在编写完TCP服务端程序server.c后,用 gcc lpthread o server.c server 生成程序server。(2) 在编写完TCP客户端程序client.c后,用gcc lpthread o client.c client 生成程序client(3) 在主机上打开一窗口,运行server。(4) 再打开另一个窗口或者在另一个主句上打开一个窗口,运行client,输入服务器的IP地址,并检查器结果的正确性。输入:【主】# ./server【从】# ./client 10 (10 为本机的ip地址)输出:【主】#server:got connection from 10(5) 客户端、服务器端窗口之间以及交错发送信息的方式相互发送和接收信息。1) 客户端、

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论