基于linux网络聊天室-毕业设计论文内容摘要:

上每个给出的文件上执行 [9]。 GCC 选项 GCC 有超过 100 个的编译选项可用。 这些选 项中的许多 可能永远都不会用到 , 但一些主要的选项将会频繁用到。 很多的 GCC 选项包括一 个以上的字符。 因此 必须为内蒙古科技大学毕业设计 说明书 (毕业 论文 ) 6 每个选项指定各自的连字符 , 并且就象大多数 Linux 命令一样 不能在一个单独的连字符后跟一组选项。 例如 , 下面的两个命令是不同的: gcc p g gcc pg 第一条命令告诉 GCC 编译 时为 prof 命令建立剖析 (profile)信息并且把调试信息加入到可执行的文件里。 第二条命令只告诉 GCC 为 gprof 命令建立剖析信息。 当 不用任何选项编译一个程序时 , GCC 将会建立 (假定编译成功 )一个名为 的 可执行文件。 例如 , 下面的命令将在当前目录下产生一个叫 的文件: gcc 用 o 编译选项来为将产生的可执行文件指定一个文件名来代替。 例如 , 将一个叫 的 C 程序编译为名叫 count 的可执行文件 , 将输入下面的命令: gcc o count 注意:当使用 o 选项时 , o 后面必须跟一个文件名。 GCC 同样有指定编译器处理多少的编译选项。 c 选项告诉 GCC 仅把源代码编译为目标代码而跳过汇编和连接的步骤。 这个 选项使用的非常频繁因为它使得编译多个 C 程序时速度更快并且更易于管理。 缺省时 GCC 建立的目标代码文件有一个 .o 的扩展名。 S 编译选项告诉 GCC 在为 C 代码产生了汇编语言文件后停止编译。 GCC 产生的汇编语言文件的缺省扩展名是 .s。 E 选项指示编译器仅对输入文件进行预处理。 当这个选项被使用时 , 预处理器的输出被送到标准输出而不是储存在文件里。 /BR优化选项 : 当 用 GCC 编译 C 代码时 , 它会试着用最少的时间完成编译并且使编译后的代码易于调试。 易于调试意味着编译后的代码 与源代码有同样的执行次序 , 编译后的代码没有经过优化。 有很多选项可用于告诉 GCC 在耗费更多编译时间和牺牲易调试性的基础上产生更小更快的可执行文件。 这些选项中最典型的是 O 和 O2 选项。 O 选项告诉 GCC 对源代码进行基本优化 , 这些优化在大多数情况下都会使程序执行的更快 ; O2 选项告诉 GCC 产生尽可能小和尽可能快的代码 , O2 选项将使编译的速度比使用 O 时慢 , 但通常产生的代码执行速度会更快。 除了 O 和 O2 优化选项外 , 还有一些低级选项用于产生更快的代码。 这些选项非常的特殊 , 而且最好只有当 完全理解这些选项将会对编译后的代码产生什么样的效果时再去使用 [10]。 内蒙古科技大学毕业设计 说明书 (毕业 论文 ) 7 调试和剖析选项 GCC 支持数种调试和剖析选项。 在这些选项里你会最常用到的是 g 和 pg 选项。 g 选项告诉 GCC 产生能被 GNU 调试器使用的调试信息以便调试你的程序。 GCC 提供了一个很多其他 C 编译器里没有的特性 , 在 GCC 里 能使 g 和 O (产生优化代码 )联 用。 这一点非常有用因为你能在与最终产品尽可能相近的情况下调试 代码。 在同时使用这两个选项时必须清楚 所写的某些代码已 经在优化时被 GCC 作了改动。 pg 选项告诉 GCC 在 程序里加入额外的代码 , 执行时产生 gprof 用的剖析信息以显示 程序的耗时情况。 GDB 调试器 GDB 的用法 Linux 包含了一个叫 gdb 的 GNU 调试程序。 gdb 是一个用来调试 C 和 C 程序的强力调试器 [11]。 它 能在程序运行时观察程序的内部结构和内存的使用情况。 以下是 gdb 所提供的一些功能: 它使你能监视你程序中变量的值。 它使你能设置断点以使程序在指定的代码行上停止执行。 它使你能 一行行的执行你的代码。 /BR在命令行上键入 gdb 并按回车键就可以运行 gdb 了 , 如果一切正常的话 , gdb 将被启动并且 将在屏幕上看到类似的内容: GDB is free software and you are wele 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 (i486slakwarelinux), Copyright 1995 Free Software Foundation, Inc. (gdb) 当启动 gdb 后 , 在命令行上指定很多的选项。 也可以以下面的方式来运行 gdb : gdb 当 用这种方式运行 gdb, 能直接指定想要调试的程序。 这将告诉 gdb 装入名为 fname 的可执行文件。 也可以用 gdb 去检查一个因程序异常终止而产生的 core 文件 , 或者与一个正在运行的程序相连。 内蒙古科技大学毕业设计 说明书 (毕业 论文 ) 8 用 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]。 Makefile 文件的编写 以上研究了编译工具 gcc 和调试工具 gdb,编程的程序文件都要经过 编译、调试,但是如果系统是的文件很多,又有先后顺序时,编译时就很麻烦的。 因此本系统 使用了makefile 文件。 或 许很多的程序员都不知道这个东西 makefile ,因为大多 Windows 的 IDE 都为程序员 做了这个工作, 在 Unix 下的软件编译,你就不能不自己写 makefile 了,会不会写内蒙古科技大学毕业设计 说明书 (毕业 论文 ) 9 makefile,从一个侧面说明了一个人是否具备完成 大型工程的能力。 因为 makefile 关系到了整个工程的编译规则。 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中, makefile 定义了一系列的规则来指 定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,而且其中还可以执行操作系统的命令。 makefile 带来的好处就是 ——―自动化编译 ‖,一旦写好,只需要一个 make 命令,整个工程完全自动编译,极大的提高了软件开发的效率。 make 是一个命令工具,是一个解释 makefile 中指令的命令工具,一般来说, 大多数的 IDE 都有这个命令,比如: Visual C++的 nmake, Linux 下 GNU 的 make。 可见, makefile 都成为了一种在工程方面的编译方法。 我们要写一个 Makefile来告诉 make命令如何编译和链接这几个文件。 我们的规则是: 如果这个工程没有编译过,那么我们的所有 C文件都要编译并被链接。 如果这个工程的某几个 C文件被修改,那么我们只编译被修改的 C文件,并链接目标程。 如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的 C文件,并链接目标程序。 Makefile 的规则: target ... : prerequisites ... mand ... … target 也就是一个目标文件,可以是 Object File,也可以是执行文件。 prerequisites就是,要生成那个 target 所需要的文件或是目标。 mand 也就是 make 需要执行的命令。 这是一个文件的依赖关系,也就是说, target 这一个或多个的目标文件依赖于prerequisites 中的文件,其生成规则定义在 mand 中。 说白一点就是说, prerequisites中如果有一个以上 的文件比 target 文件要新的话, mand 所定义的命令就会被执行。 这就是 Makefile 的规则 [12]。 又例如: objects = \ 于是,我们就可以很方便地在我们的 makefile 中以 ―$(objects)‖的方式来使用这个变量了 , 我们的 makefile 就变成下面这个样子: 内蒙古科技大学毕业设计 说明书 (毕业 论文 ) 10 文件 CFLAG := g CC := gcc all:serverv3 client serverv3: $(CC) $(CFLAG) o serverv3 *.o lpthread client: $(CC) $(CFLAG) o client *.o lpthread clean: rm rfv serverv3 client *.o 这里我们的文件虽多,但不用我们一个一个的去 gcc 编译, Makefile 文件已经安排好 ,以个 make 就可以按照个各个文件的依赖顺序生成我们想要的 .o 文件。 当我们想要重新生成编译时,其中 clean 可以清理掉上次产生的旧文件,这只需要命令 make clean。 分别如下图 和图 所示。 图 make 命令的编译界面 图 make clean 命令的界面 内蒙古科技大学毕业设计 说明书 (毕业 论文 ) 11 第三章 实现 分析 及关键技术 实现 分析 功能分析 本系统是要 在 Linux 系统下 实现 一个聊天室系统,主要有服务器和客户端。 它具备的基本功 能包括注册、登陆、群聊、私聊、查看在线人数 、查看聊天记录 等。 服务器端: 负责处理用户发来的各种信息, 管理用户的动作 (用户注册、用户登录、群发信息、和特定用户私聊等 )和管理用户信息 (保存用户个人资料及聊天记录等 )。 客户端: 主要是可以查看在线人数、聊天记录,发送信息给特定用户或群等功能。 (系统各个功能函数的清单见附录 表 ) 设计 分析 本聊天系统的 为 c/s 形式,服务器主要就是处理 客户 的输入信息。 首先要存储客户的个人资料;再有, 传输客户的聊天信息时,也要 记录下客户的聊天记录,以备查看聊天记录所用。 当然 ,服务器还有自己的动态数据处理。 客户状态 分为链接客户、非链接客户 , 我们采用结构体存储链接客户的信息, 以链表式来记录链接客户。 而链接客户又分为登陆用户与未登陆用户,这就通过修改链表上客户的名字。 当客户以链接客户服务器端时,也就是还未登录,就给了客户一个统一的名字 ,当客户登 陆时就把其统一的名字改为客户登陆名,也就是客户注册时输入的名字。 同时并发服务器要一直在为连接用户创建线程, 系统 设计 的总框图 [13],如图 所示。 客户端 socket 服务器 图 系统设 计总框图 内蒙古科技大学毕业设计 说明书 (毕业 论文 ) 12 技术分析 基于以上的功能分析和数据分析 ,首先通信 Socket套接字是实现 c/s通信的接口,且使用 tcp协议。 传输数据时,客户端需要创建两个线程分别监听键盘 (即用户输入信息 )和socket接口 (即传入信息 )。 服务器则要给每个链接的客户创建一个线程来进行信息的传输 ,即实现并发服务器 ,正如图。 并发服务器是指在一个时刻可以处理多个客户请求的服务器。 这只是概念上和表面的并发,并不一定是真正同时处理多。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。