




已阅读5页,还剩47页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
内蒙古科技大学毕业设计说明书(毕业论文)基于Linux网络聊天室的设计与实现摘 要基于资源共享和软件自由的思想,linux成为越来越多技术人员的理想之国。作为一个稳定的多用户类unix网络操作系统,linux能提供完美的网络解决方案,出色的胜任网络构建和维护。出于对unix技术优势的出色继承和延续,linux对多种网络协议的支持使得网络解决方案极大的丰富。在 Linux 中的网络编程是通过socket接口来进行的,Socket是TCP/IP网络的API。不但是一种特殊的I/O,它也是一种文件描述符。socket有TCP和UDP两个协议,TCP协议有数据的可靠性、应用的实时性、网络的可靠性三个优点。因此选择TCP协议更为可靠。数据这里 NGE 听。;编程人员共同开发的。本系统实现了在Linux网络聊天室的基本功能。在Linux下编写并调试服务器端程序和客户端程序,实现了客户、服务器之间的连接接和通信。可以在单机上开辟两个窗口分别运行客户、服务器端的程序,或者两台主机链接分别作为客户和服务器的方式。总体来说,此设计以嵌入式C语言为开发语言,使用网络套接字socket建立连接,并运用多线程实现数据的交换,程序经gcc调试成功,可以在单机网络聊天中使用。关键字:网络聊天室; Linux;socket;TCP; C语言Network chat room of design and implementation under linuxAbstractOn the basis of the thought with free resource-sharing and software, linux becomes more and more technical staffs ideal country.and is attracting more persons to join in this ideal constantly.As a steady multi-user unix network operating system, linux can offer the perfect network solution and is competent of constructing and maintaining the network excellent.For the inheritting and extending splendidly of technological advantage to unix, the abundance that linux support to many kinds of procotols makes the network with great solution. In Linux, network programming is carried out through the socket interface,Socket is the API of TCP / IP network.Not only Is a special I / O but also is a file descriptor.Socket has two protocols which are TCP and UDP,TCP protocol has three advantages of the eliability of data, the application of real-time and the network reliability.So it is more reliable to choose TCP protocol.The system Implementate the basic function of the network chat room under linux. Prepared and debugging server and client program in the Linux,achieved the Links and communication between tne server and client . Can open up two windows In a single machine to run the server and client program respectively,or to connect twohosts, respectively, as the way of the client and server. Overall,the design use C language for the development language, creat link using the network socket,and use multiple to the exchange of data. The program by the success of gcc debug debugger, you can use it in the chat of stand-alone network.Keyword: Network Chat Rooms; Linux; Socket; c language48内蒙古科技大学毕业设计说明书(毕业论文)目 录摘 要IAbstractII第一章绪 论11.1研究背景11.2应用概述21.3 优点31.4 论文主要工作4第二章 Linux网络聊天室工具概述52.1嵌入式C语言52.2GCC编译器52.2.1GCC的用法52.2.2调试和剖析选项72.3GDB调试器72.3.1 GDB的用法72.3.2 用gdb调试 GCC 程序82.4Makefile文件的编写8第三章 实现分析及关键技术113.1实现分析113.1.1功能分析113.1.2设计分析113.1.3技术分析123.2 TCP通信123.3多线程(pthread)133.3.1线程pthread133.3.2 数据类型及用法143.4互斥量(mutex)153.5网络套接字(socket)173.5.1 概述173.5.2地址及顺序处理173.5.3连接函数的说明20第四章 Linux网络聊天室socket 编程实现过程234.1聊天室Socket编程连接的过程234.2聊天室程序设计及界面244.2.1服务器的启动244.2.2客户端主界面及聊天功能展示264.2.3 异常处理31第五章 总结32参考文献33附录35致谢48 内蒙古科技大学毕业设计说明书(毕业论文)第一章 绪 论1.1研究背景Linux是一种针对PC计算机和工作站的操作系统,Linux 是为普通个人电脑设计,可免费分发的、兼容Unix 的操作系统。它支持各种各样的软件(包括大量免费软件)。它是在386 电脑上开发出来的,它现在支持486、586、Pentium、PowerPC、Sun Sparc 和DEC Alp ha 的硬件。Linus Torvald和其它的遍布世界各地的编程人员共同开发的,作为一种操作系统,它具有与Unix、Mac、Windows和Windows NT同样的功能1。提到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(以及同一许可证下的大量其他软件)不仅现在自由可用,而且以后经过任何修改这后都仍然可以自由使用2。 Unix是由ATT贝尔实验室的Ken Thompson和Dennis Ritchie于1969年在一台已经废弃了的PDP-7上开发的;最初它是一个用汇编语言写成的单用户操作系统。后来,他们又在PDP-11上用C语言重新编写(发明C语言的部分目的就在于此),把Unix做成为了一个文本处理系统,这使Unix在贝尔实验室得到广泛的应用。Unix的最初版本免费提供给许多知名的大学的计算机系使用。加州大学伯克利分校的计算机系就是其中的一名,并地Unix进行了修改增加了许多新的特点,这就是广为人知的BSC版本的Unix。与此同时,其它独立开发的Unix版本也开始萌生3。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也在继续完善。3、Linux的未来 Linux最强大的生命力在于其公开的开发过程。每个人都有可以自由获取内核源程序,每个人都有要不得以运载源程序加以修改,而后他人也可以自由获取你修改后的源程序。Linux这种独特的自由流畅的开发模型已被命名为bazaar(集市模型)。Bazaar开发模型通过重视实验,征集并充分利用早期的反馈,对巨大数量的脑力资源进行平衡配置,可以开发出更优秀的软件。1.2应用概述嵌入式系统是指操作系统和功能软件集成于计算机硬件系统之中。简单的说就是系统的应用软件与系统的硬件一体化,类似与BIOS的工作方式4。具有软件代码小、高度自动化、响应速度快等特点,特别适合于要求实时的和多任务的体系。随着Intenet的日益发展和普及,网络在嵌入式系统中应用非常广泛,越来越多的嵌入式设备采用Linux操作系统5。Linux在近十年的时间里发展迅速,不仅奠定了坚实的网络基础,成为众多服务器强有力的支持,更是发展了嵌入式领域乃至桌面领域。Linux 作为一种自由免费的操作系统,相对于windows 具有良好的稳定性和出色的网络性能,此被广泛应用于各种网络服务器。尽管在短期内还不能形成规模与windows系统相抗衡,但是他的发展势头已不可阻挡。在服务器领域,Linux已经是后来居上,占领了微软windows服务器的一些市场,甚至有取代unix的迹象。Linux是一个源代码公开的免费操作系统,具有强移植性,所以对基于Linux的Socket网络编程的研究越来越重要,其c/s模式如图1.1所示。图1.1客户端/服务器模式Socket实际是网络传输层供给应用层的编程接口。传输层则在网络层的基础上提供进程到进程访问的逻辑通道,而应用层的进程则利用传输层向另一台主机的某一进程通信6。Socket就是应用层与传输层之间的桥梁,如图1.2所示。图1.2 socket是传输层与应用层间的桥梁使用Socket编程时可以开发客户机和服务器应用程序,它们可以在本地网络上进行通信,也可以通过Internet在全球范围内进行通信。编写并运行 Socket的客户端和服务器端程序,双方通过套接字建立了服务连接请求,并且通过一些方法提高Socket的性能。1.3 优点近年嵌入式系统发展成为热点,Linux环境下利用socket设计网络聊天室系统,是嵌入式发展的一个趋势之一,主要因为它有以下三个优点:1、Linux作为一个开源的操作系统,利于使用人员交流学习,而且Linux 的许多特性有利于网络编程。首先,Linux 系统拥有许多网络编程的库函数,可以方便地实现客户机/ 服务器模型。其次,Linux 秉承了UNIX 的设备无关性这一优秀特征,即它通过文件的描述符实现了统一的设备接口,网络的Socket数据传输是一种特殊的I/ 0 ,Scoket 也是一种文件描述符。再有,且其内核小、效率高、兼容性好和稳定性强等优点。2、Socket接口是一个通用的接口,它不仅支持各种网络工作形式,而且还是一个交互式通讯机制。一个套接字描述一个通讯连接的一端。套接字可以被看做一个专门的管道,但又不像管道,套接字对它们能容纳的数量没有限制,且Linux支持多种类型的套接字。3、目前计算机网络持续而高速地发展,其中基于TCP/ IP 协议网络已经成为计算机之间组网的常见形式. 基于TCP/ IP 的网络编程,也得到了广泛的应用。Tcp/ip这个种网络协议是internet的基础协议7。它是一组计算机通信协议族,具有开放式互联环境,很容易实现各种局域网和广域网的集成式互联。socket通讯所采用的协议分为面向连接和面向非连接两种,由于UDP尽最大努力但提供不可靠的服务,简单的UDP算法可以在本地网络条件好的环境中良好工作,但在环境较复杂的网络中就不能正常工作了,必须通过超时和重传来实现可靠性,而TCP则提供了数据传输的完全可靠性,因此选择TCP通信协议更可靠些 8。1.4 论文主要工作本文是根据Linux环境下socket套接字通信原理利用c语言编程的网络聊天室系统。第一章:绪论主要简介了Linux网络聊天室的研究背景,同时对于其应用和优点进行了概述,是对本系统的整个研究背景的研究介绍。第二章 Linux网络聊天室环境及工具概述本章介绍了对使用的开发语言c语言进行了概述;还介绍了本系统使用的编译及调试工具;最后,还对本系统使用的文件编译规则makefile文件进行了介绍和程序讲解。第三章 Linux聊天室的实现分析及关键技术首先,对本系统的要实现的功能、要处理的数据和所需的技术进行分析、总结。其次,介绍了所需的技术(tcp、线程、mutex(互斥量)、socket)。第四章 Linux网络聊天室socket 编程实现过程此章借助socket的链接过程,介绍了本聊天室系统编程的大体过程及主要实现代码的讲解。之后,对本聊天室系统的功能实现及异常处理过程(内附截图及部分主要代码)。第二章 Linux网络聊天室工具概述12.1 嵌入式C语言C 是一种在 UNIX 操作系统的早期就被广泛使用的通用编程语言。它最早是由贝尔实验室的 Dennis Ritchie 为了UNIX 的辅助开发而写的, 开始时 UNIX 是用汇编语言和一种叫 B 的语言编写的。从那时候起,C就成为世界上使用最广泛计算机语言。C 能在编程领域里得到如此广泛支持的原因有以下一些:1、它是一种非常通用的语言。几乎所能想到的任何一种计算机上都有至少一种能用的 C 编译器。 并且它的语法和函数库在不同的平台上都是统一的, 这个特性对开发者来说很有吸引力。 2、用C写的程序执行速度很快。 3、C 是所有版本的UNIX上的系统语言。4、C 在过去的二十年中有了很大的发展。 在80年代末期美国国家标准协会(American National Standards Institute)发布了一个被称为 ANSI C 的 C 语言标准。这更加保证了将来在不同平台上的 C 的一致性。在80年代还出现了一种 C 的面向对象的扩展称为 C+。2.2 GCC编译器2.2.1 GCC的用法1、概述Linux 上可用的 C 编译器是 GNU C 编译器,它随 Slackware Linux 发行的。 GNU C 编译器(GCC)是一个全功能的 ANSI C 兼容编译器。使用 GCC,通常后跟一些选项和文件名来使用 GCC 编译器。gcc 命令的基本用法如下: gcc options filenames 命令行选项指定的操作将在命令行上每个给出的文件上执行9。2、GCC选项GCC 有超过100个的编译选项可用。 这些选项中的许多可能永远都不会用到, 但一些主要的选项将会频繁用到。 很多的 GCC 选项包括一个以上的字符。 因此必须为每个选项指定各自的连字符, 并且就象大多数 Linux 命令一样不能在一个单独的连字符后跟一组选项。例如, 下面的两个命令是不同的:gcc -p -g test.cgcc -pg test.c 第一条命令告诉 GCC 编译 test.c 时为 prof 命令建立剖析(profile)信息并且把调试信息加入到可执行的文件里。 第二条命令只告诉GCC 为 gprof 命令建立剖析信息。 当不用任何选项编译一个程序时, GCC 将会建立(假定编译成功)一个名为 a.out 的可执行文件。 例如, 下面的命令将在当前目录下产生一个叫 a.out 的文件: gcc test.c 用 -o 编译选项来为将产生的可执行文件指定一个文件名来代替 a.out。例如, 将一个叫 count.c 的 C 程序编译为名叫 count 的可执行文件, 将输入下面的命令: gcc -o count count.c 注意:当使用 -o 选项时,-o 后面必须跟一个文件名。 GCC 同样有指定编译器处理多少的编译选项。-c 选项告诉 GCC 仅把源代码编译为目标代码而跳过汇编和连接的步骤。这个选项使用的非常频繁因为它使得编译多个 C 程序时速度更快并且更易于管理。缺省时 GCC 建立的目标代码文件有一个 .o 的扩展名。-S 编译选项告诉 GCC 在为 C 代码产生了汇编语言文件后停止编译。GCC 产生的汇编语言文件的缺省扩展名是 .s 。 -E 选项指示编译器仅对输入文件进行预处理。 当这个选项被使用时, 预处理器的输出被送到标准输出而不是储存在文件里。优化选项 :当用 GCC 编译 C 代码时, 它会试着用最少的时间完成编译并且使编译后的代码易于调试。易于调试意味着编译后的代码与源代码有同样的执行次序, 编译后的代码没有经过优化。有很多选项可用于告诉 GCC 在耗费更多编译时间和牺牲易调试性的基础上产生更小更快的可执行文件。这些选项中最典型的是-O 和 -O2 选项。-O 选项告诉 GCC 对源代码进行基本优化,这些优化在大多数情况下都会使程序执行的更快;-O2 选项告诉 GCC 产生尽可能小和尽可能快的代码,-O2 选项将使编译的速度比使用 -O 时慢,但通常产生的代码执行速度会更快。除了 -O 和 -O2 优化选项外, 还有一些低级选项用于产生更快的代码。 这些选项非常的特殊, 而且最好只有当完全理解这些选项将会对编译后的代码产生什么样的效果时再去使用10。2.2.2调试和剖析选项GCC 支持数种调试和剖析选项。 在这些选项里你会最常用到的是 -g 和 -pg 选项。 -g 选项告诉 GCC 产生能被 GNU 调试器使用的调试信息以便调试你的程序。 GCC 提供了一个很多其他 C 编译器里没有的特性, 在 GCC 里能使 -g 和 -O (产生优化代码)联用。这一点非常有用因为你能在与最终产品尽可能相近的情况下调试代码。 在同时使用这两个选项时必须清楚所写的某些代码已经在优化时被 GCC 作了改动。 -pg 选项告诉 GCC 在程序里加入额外的代码, 执行时产生 gprof 用的剖析信息以显示程序的耗时情况。 2.3 GDB调试器2.3.1 GDB的用法Linux 包含了一个叫 gdb 的 GNU 调试程序。gdb 是一个用来调试 C 和 C 程序的强力调试器11。它能在程序运行时观察程序的内部结构和内存的使用情况。 以下是 gdb 所提供的一些功能: 它使你能监视你程序中变量的值。 它使你能设置断点以使程序在指定的代码行上停止执行。 它使你能一行行的执行你的代码。在命令行上键入 gdb 并按回车键就可以运行 gdb 了, 如果一切正常的话, gdb 将被启动并且将在屏幕上看到类似的内容: GDB is free software and you are welcome to distribute copies of it under certain conditions; type show copying to see the conditions There is absolutely no warranty for GDB; type show warranty for details. GDB 4.14 (i486-slakware-linux), Copyright 1995 Free Software Foundation, Inc. (gdb) 当启动 gdb 后, 在命令行上指定很多的选项。也可以以下面的方式来运行 gdb : gdb 当用这种方式运行 gdb,能直接指定想要调试的程序。这将告诉gdb 装入名为 fname 的可执行文件。也可以用 gdb 去检查一个因程序异常终止而产生的 core 文件, 或者与一个正在运行的程序相连。 2.3.2 用gdb调试 GCC 程序为调试编译代码(Compiling Code for Debugging),为了使 gdb 正常工作, 你必须使你的程序在编译时包含调试信息。 调试信息包含你程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号。gdb利用这些信息使源代码和机器码相关联。 在编译时用 -g 选项打开调试选项。gdb 基本命令 :gdb 支持很多的命令使你能实现不同的功能。 这些命令从简单的文件装入到允许你检查所调用的堆栈内容的复杂命令,下面列出了你在用 gdb 调试时会用到的一些命令。如:file 装入想要调试的可执行文件。kill 终止正在调试的程序。 list 执行一行源代码但不进入函数内部。 next 执行一行源代码但不进入函数内部。 step 执行一行源代码而且进入函数内部。 run 执行当前被调试的程序。quit 终止 gdb。watch 使你能监视一个变量的值而不管它何时被改变。 break 在代码里设置断点, 这将使程序执行到这里时被挂起。 make 使你能不退出 gdb 就可以重新产生可执行文件。 shell 使你能不离开 gdb 就执行 UNIX shell 命令。 gdb 支持很多与 UNIX shell 程序一样的命令编辑特征。你能象在 bash 或 tcsh里那样按 Tab 键让 gdb 帮你补齐一个唯一的命令, 如果不唯一的话 gdb 会列出所有匹配的命令,你也能用光标键上下翻动历史命令12。2.4 Makefile文件的编写以上研究了编译工具gcc和调试工具gdb,编程的程序文件都要经过编译、调试,但是如果系统是的文件很多,又有先后顺序时,编译时就很麻烦的。因此本系统使用了makefile文件。很译及/osh999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999或许很多的程序员都不知道这个东西makefile ,因为大多Windows的IDE都为程序员做了这个工作,在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。因为makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,而且其中还可以执行操作系统的命令。 makefile带来的好处就是“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如: Visual C+的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。我们要写一个Makefile来告诉make命令如何编译和链接这几个文件。我们的规则是: 1、如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。 2、如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程。 3、如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。Makefile的规则:target . : prerequisites . command . target也就是一个目标文件,可以是Object File,也可以是执行文件。prerequisites就是,要生成那个target所需要的文件或是目标。command也就是make需要执行的命令。这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则12。又例如:objects = main.o kbd.o command.o display.o insert.o search.o files.o utils.o 于是,我们就可以很方便地在我们的makefile中以“$(objects)”的方式来使用这个变量了,我们的makefile就变成下面这个样子:Makefile.h文件 CFLAG := -gCC := gccall:serverv3 clientserverv3:serverv3.c groupv3.o regist.o login.o showuserv3.o help.o listv3.o singlev3.o $(CC) $(CFLAG) -o serverv3 serverv3.c *.o -lpthreadclient:client.c main.h $(CC) $(CFLAG) -o client client.c *.o -lpthreadclean: rm -rfv serverv3 client *.o这里我们的文件虽多,但不用我们一个一个的去gcc编译,Makefile文件已经安排好,以个make就可以按照个各个文件的依赖顺序生成我们想要的.o文件。当我们想要重新生成编译时,其中clean可以清理掉上次产生的旧文件,这只需要命令make clean。分别如下图2.1和图2.2所示。图2.1 make命令的编译界面图2.2 make clean命令的界面第三章 实现分析及关键技术33.1 实现分析3.1.1 功能分析本系统是要在Linux系统下实现一个聊天室系统,主要有服务器和客户端。它具备的基本功能包括注册、登陆、群聊、私聊、查看在线人数、查看聊天记录等。1、服务器端:负责处理用户发来的各种信息,管理用户的动作(用户注册、用户登录、群发信息、和特定用户私聊等)和管理用户信息(保存用户个人资料及聊天记录等)。2、客户端:主要是可以查看在线人数、聊天记录,发送信息给特定用户或群等功能。(系统各个功能函数的清单见附录表A.1)3.1.2 设计分析本聊天系统的为c/s形式,服务器主要就是处理客户的输入信息。首先要存储客户的个人资料;再有,传输客户的聊天信息时,也要记录下客户的聊天记录,以备查看聊天记录所用。当然,服务器还有自己的动态数据处理。客户状态分为链接客户、非链接客户,我们采用结构体存储链接客户的信息,以链表式来记录链接客户。而链接客户又分为登陆用户与未登陆用户,这就通过修改链表上客户的名字。当客户以链接客户服务器端时,也就是还未登录,就给了客户一个统一的名字,当客户登陆时就把其统一的名字改为客户登陆名,也就是客户注册时输入的名字。同时并发服务器要一直在为连接用户创建线程,系统设计的总框图13,如图3.1所示。客户端 socket 服务器图3.1 系统设计总框图3.1.3 技术分析基于以上的功能分析和数据分析,首先通信Socket套接字是实现c/s通信的接口,且使用tcp协议。传输数据时,客户端需要创建两个线程分别监听键盘(即用户输入信息)和socket接口(即传入信息)。服务器则要给每个链接的客户创建一个线程来进行信息的传输,即实现并发服务器,正如图3.1所示。并发服务器是指在一个时刻可以处理多个客户请求的服务器。这只是概念上和表面的并发,并不一定是真正同时处理多个请求,如果服务器具有多个处理器,则是实际的并发,但对于大多数服务器来说,是利用操作系统的某种机能,比如异步i/o、多进程、多线程等技术来实现的,只是从客户的角度看上去看仿佛服务器并发地与多个客户通讯。linux 提供了两种形式的并发,进程和线程。因此常见的并发服务器即是基于进程的并发和基于线程的并发两种类型。线程并发服务器是使用就涉及到线程同步问题,mutex(互斥量)则能解决这个问题。当然最主要的是socket函数调用。总结其上有tcp、线程、mutex(互斥量)、socket。3.2 TCP通信Socket 是建立在传输层协议(主要是TCP 和UDP)上的一种套接字规范, Socket接口是TCP/ IP 网络最为通用的API , 也是在Internet上进行应用开发最通用API14 ,socket 屏蔽了底层通信软件和具体操作系统的差异,使得任何两台安装了TCP 协议软件和实现了Socket 规范的计算机之间的通信成为可能。TCP是传输控制协议的简称,它是提供一条全双工的、可靠的信道。TCP提供面向连接的服务,在传送数据之前必须先建立连接,数据传送结束后要释放连接。TCP不提供广播和多播服务。由于TCP要提供可靠的、面向连接的运输服务,所以不可避免地增加了许多系统开销,比如确认、流量控制、计时器以及连接管理等都需要占用许多系统的时空资源。 两个计算机之间如果使用TCP通信,其连接过程需要三次握手实现15,TCP对话通过三次握手来初始化的。三次握手的目的是使数据段的发送和接收同步,并建立虚连接。下面描述了这三次握手的简单过程。1、初始化主机通过一个同步标志置位的数据段发出会话请求。2、接收主机通过发回具有以下项目的数据段表示回复:同步标志置位、即将发送的数据段的起始字节的顺序号、应答并带有将收到的下一个数据段的字节顺序号。3、请求主机再回送一个数据段,并带有确认顺序号和确认号。如图3.2所示图3.2 tcp三次握手3.3 多线程(pthread)3.3.1 线程pthreadPOSIX thread 简称为pthread,Posix线程是一个POSIX标准线程.该标准定义内部API创建和操纵线程16。点对点通信的实现知识完成了主机进程与服务器进程之间的连接,建立连接的进程之间是一对一的联系,即主机的一个进程与服务器的一个进程之间建立的连接。而每个进程进行通信的环节都包括了发送信息和接口信息两个任务,这两个任务通过一个端口地址发送和接收。 对于多个并发的任务需要创建多个线程或线程去实现。使用一个进程去完成发送信息是没有问题的,因为发送总是主动的;而使用同一个进程再去完成接受信息去不一定会成功,因为接受信息是被动的,所以当没有信息可以接收时,该进程就会被阻塞,从而导致发送任务也一起被阻塞。同一个端口的发送和接收是两个并发任务,应该由两个不同的任务去分别完成信息的发送和接收。这样,当接收信息任务因没有信息而被阻塞时,不至于影响发送任务的执行。那么,发送和接收两个任务是使用两个进程还是两个进程去完成呢?在网络通信中,端口地址是以进程为单位进程分配的,而一个进程与外界的消息发送与接收必须通过分配给它的同一个端口进行。因此,不能通过创建进程方式来解决上诉问题,因为两个进程会分别对应两个不同的端口,而发送和接收必须使用同一端口。线程不是资源分配的单位,所以如果使用两个线程不会对线程分配新的端口。因此,本实验需要使用两个线程去分别完成发送和接收信息的任务,这两个线程共享其进程拥有的统一个端口地址。由于创建进程的进程本身会作为一个线程来调度,所以只需要再创建一个线程专门负责接收信息就可以了。因此,对于从每个客户端发来的请求,服务器端都要创建相应的线程去接收并处理;同理,对于客户端而言,也要创建一个线程去读取服务器端发来的信息。3.3.2数据类型及用法1、各个函数类型pthread_t:线程句柄 pthread_create():创建一个线程 pthread_exit():终止当前线程 pthread_join():阻塞当前的线程,直到另外一个线程运行结束pthread_attr_detach():获取脱离状态的属性2、线程创建与结束(1)pthread_t线程的标识符类型,pthread_t在头文件/usr/include/bits/pthreadtypes.h中定义: typedef unsigned long int pthread_t; (2)pthread_create thread_create用来创建一个线程,它的原型为: extern int pthread_create _P (pthread_t *_thread, _const pthread_attr_t *_attr,void *(*_start_routine) (void *), void *_arg); 第一个参数为指向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。这里,我们的 函数thread不需要参数,所以最后一个参数设为空指针。第二个参数我们也设为空指针,这样将生成默认属性的线程。对线程属性的设定和修改我们将在下一 节阐述。当创建线程成功时,函数返回0,若不为0则说明创建线程失败,常见的错误返回代码为EAGAIN和EINVAL。前者表示系统限制创建新的线程, 例如线程数目过多了;后者表示第二个参数代表的线程属性值非法。创建线程成功后,新创建的线程则运行参数三和参数四确定的函数,原来的线程则继续运行下一 行代码。 (3)pthread_join 函数pthread_join用来等待一个线程的结束。函数原型为: extern int pthread_join _P (pthread_t _th, void *_thread_return); 第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。 (4)pthread_exit 线程除了正常执行结束外,还可以通过函数pthread_exit来结束它,pthread_exit的函数原型为: extern void pthread_exit _P (void *_retval) _attribute_ (_noreturn_); 唯一的参数是函数的返回代码,只要pthread_join中的第二个参数thread_return不是NULL,这个值将被传递给 thread_return。最后要说明的是,一个线程不能被多个线程等待,否则第一个接收到信号的线程成功返回,其余调用pthread_join的线 程则返回错误代码ESRCH。void thread(node *p)pthread_create(&tidi,NULL,(void*)thread,ptr);3.4 互斥量(mutex)网络聊天系统多线程就涉及到线程同步问题,需要用到互斥量。互斥对象是系统内核对象, 各线程都可以拥有它, 谁拥有谁就能执行; 执行完毕, 用 ReleaseMutex 函数释放拥有权, 以让其他等待的线程使用。互斥量从本质上说就是一把锁, 提供对共享资源的保护访问。1、初始化:在 Linux下, 线程的互斥量数据类型是pthread_mutex_t. 在使用前, 要对它进行初始化:对于静态分配的互斥量, 可以把它设置为PTHREAD_MUTEX_INITIALIZER, 或者调用pthread_mutex_init.对于动态分配的互斥量, 在申请内存(malloc)之后, 通过pthread_mutex_init进行初始化, 并且在释放内存(free)前需要调用pthread_mutex_destroy.原型:int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restric attr);int pthread_mutex_destroy(pthread_mutex_t *mutex);头文件:#include 返回值:成功则返回0, 出错则返回错误编号.说明:如果使用默认的属性初始化互斥量, 只需把attr设为NULL. 其他值在以后讲解。2、互斥操作:对共享资源的访问, 要对互斥量进行加锁, 如果互斥量已经上了锁, 调用线程会阻塞, 直到互斥量被解锁. 在完成了对共享资源的访问后, 要对互斥量进行解锁。首先说一下加锁函数:头文件:#include 原型:int pthread_mutex_lock(pthread_mutex_t *mutex);int pthread_mutex_trylock(pthread_mutex_t *mutex);返回值: 成功则返回0, 出错则返回错误编号.解锁函数:头文件:#include 原型: int pthread_mutex_unlock(pthread_mutex_t *mutex);返回值:成功则返回0, 出错则返回错误编号.pthread_mutex_lock声明开始用互斥锁上锁,此后的代码直至调用pthread_mutex_unlock为止,均被上锁,即同一时间只 能被一个线程调用执行。当一个线程执行到pthread_mutex_lock处时,如果该锁此时被另一个线程使用,那此线程被阻塞,即程序将等待到另一 个线程释放此互斥锁以下是此聊天室系统的互斥量在main.h中定义:extern pthread_mutex_t mutex;#define LOCK(mutex) do /检查上锁是否正确if(pthread_mutex_lock(&mutex) != 0) perror(pthread_mutex_lock); exit(EXIT_FAILURE); while (0)#define UNLOCK(mutex) do /检查解锁是否正确if(pthread_mutex_unlock(&mutex) != 0) perror(pthread_mutex_unlock); exit(EXIT_FAILURE); while (0) /注意:“”是接续符其中,extern代表其他函数可以调用此变量,#define代表互斥量mutex是带参数的宏定义。当需要上锁时只需要调用LOCK(mutex),解锁时则调用UNLOCK(mutex)就能够解锁。3.5 网络套接字(socket)3.5.1 概述1、连接步骤Socket接口上TCP/IP网络应用程序接口(API),它提供了许多函数,本系统就使用它们来开发TCP/IP网络聊天室程序17。使用Socket接口进行网络通信的过程,简要步骤如下:(1)建立一个
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 摩托机车基本知识培训课件
- 摄影机器基础知识培训课件
- 摄影师基本知识培训内容课件
- 塑钢窗技术试题及答案
- 2025餐馆转让经营合同示例
- 2025年高二【数学(人教A版)】两条直线的交点坐标-学习任务单
- 公司财务知识培训宣传稿课件
- 大数据行业编程面试题及答案解析
- 2025终止房屋租赁合同通知模板
- 2025茶叶销售合同范文
- 麦当劳标准化执行
- 重症患者目标导向性镇静课件
- 混凝土养护方案
- 高质量SCI论文入门必备从选题到发表全套课件
- 长螺旋钻孔咬合桩基坑支护施工工法
- 库欣综合征英文教学课件cushingsyndrome
- 220kv升压站质量评估报告
- C语言程序设计(第三版)全套教学课件
- 未来医美的必然趋势课件
- 附件1发电设备备品备件验收及仓储保养技术标准
- 12、信息通信一体化调度运行支撑平台(SG-I6000)第3-8部分:基础平台-系统安全防护
评论
0/150
提交评论