基于Linux点对点聊天文件传输系统_第1页
基于Linux点对点聊天文件传输系统_第2页
基于Linux点对点聊天文件传输系统_第3页
基于Linux点对点聊天文件传输系统_第4页
基于Linux点对点聊天文件传输系统_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

1、学校代码:学 号: 本科毕业设计说明书(题 目:基于Linux点对点聊天文件传输系统学生姓名:学 院:信息工程学院系 别:计算机系专 业:计算机科学与技术班 级:指导教师:二 一 一 年 六 月 摘 要本文是要在Linux平台下开发一款点对点聊天文件传输系统。实现即时聊天功能和文件的传输。系统用c语言进行编写,使用到了GTK+库,运用gcc编程语言编译器进行编译。开发中利用了计算机网络编程的基本理论知识,如TCP/IP协议、客户端/服务器端模式(Client/Server模式)、网络编程的设计方法等。使用了流式套接字实现客户端与服务器端的连接。通过创建多线程实现I/O流的非阻塞状态。使用gla

2、de生成可视化图形界面,可以在短时间内建立系统应用原型,然后,对初始原型系统进行不断修正和改进,直到形成可行系统。综合运用以上技术能够开发出一款基于Linux平台的聊天文件传输系统。受开发人员技术水平的限制,本系统只能归为简单的聊天系统,因为本系统与现在基于windows平台广泛应用的聊天系统的功能还用很大差距,需要用到更多的技术才能够实现更完美功能。关键词:点对点传输;Socket;gladeAbstractThis paper is to develop a Linux platform file transfer peer chat system. Achieve real-time c

3、hat and file transferC language for writing system, used the GTK + library and gcc compiler to compile programming languages. Development of computer network programming using the basic theoretical knowledge, such as TCP / IP protocol, client / server mode (Client / Server mode), web programming des

4、ign methods. Using stream socket client and server-side to achieve connection. Achieved by creating a multi-threaded I/O streams of non-blocking state. Use glade to generate visual graphical interface, the application can create a system prototype in a short time, then, the initial prototype system

5、constantly revised and improved, until the formation of a viable system.Integrated use of these technologies to develop a Linux-based chat file transfer system. By the developers technical limitations, This system can only be classified as a simple chat system, Because the system is now widely used

6、on windows platform chat system also features a large gap with, Need to use more technology to be able to achieve a more perfect function.Keywords: Point-to-point transmission ;Socket ;glade内蒙古工业大学毕业设计说明书PAGE 内蒙古工业大学毕业设计说明书- 1-目 录 TOC o 1-3 h z u HYPERLINK l _Toc296161473 引 言 PAGEREF _Toc296161473 h

7、 1 HYPERLINK l _Toc296161474 第一章 主要技术简介 PAGEREF _Toc296161474 h 2 HYPERLINK l _Toc296161475 1.1 LINUX简介 PAGEREF _Toc296161475 h 2 HYPERLINK l _Toc296161476 1.2 SOCKET简介 PAGEREF _Toc296161476 h 2 HYPERLINK l _Toc296161477 1.2.1 Socket的创建 PAGEREF _Toc296161477 h 3 HYPERLINK l _Toc296161478 1.2.2 Socke

8、t工作过程 PAGEREF _Toc296161478 h 3 HYPERLINK l _Toc296161479 1.2.3 Socket常用函数 PAGEREF _Toc296161479 h 3 HYPERLINK l _Toc296161480 1.3 GTK PAGEREF _Toc296161480 h 4 HYPERLINK l _Toc296161481 1.4 GCC概述 PAGEREF _Toc296161481 h 4 HYPERLINK l _Toc296161482 1.5 TCP简介 PAGEREF _Toc296161482 h 5 HYPERLINK l _To

9、c296161483 1.6 进程与线程 PAGEREF _Toc296161483 h 5 HYPERLINK l _Toc296161484 1.6.1 进程 PAGEREF _Toc296161484 h 5 HYPERLINK l _Toc296161485 1.6.2 线程 PAGEREF _Toc296161485 h 6 HYPERLINK l _Toc296161486 1.6.3 线程与进程的区别 PAGEREF _Toc296161486 h 7 HYPERLINK l _Toc296161487 1.7 图形界面生成工具介绍 PAGEREF _Toc296161487 h

10、 7 HYPERLINK l _Toc296161488 1.7.1 Glade PAGEREF _Toc296161488 h 7 HYPERLINK l _Toc296161489 1.7.2 GTK+ PAGEREF _Toc296161489 h 7 HYPERLINK l _Toc296161490 第二章 系统设计 PAGEREF _Toc296161490 h 9 HYPERLINK l _Toc296161491 2.1 开发需求 PAGEREF _Toc296161491 h 9 HYPERLINK l _Toc296161492 2.1.1 运行环境 PAGEREF _To

11、c296161492 h 9 HYPERLINK l _Toc296161493 2.1.2 客户需求 PAGEREF _Toc296161493 h 9 HYPERLINK l _Toc296161494 2.2 系统功能描述 PAGEREF _Toc296161494 h 9 HYPERLINK l _Toc296161495 2.3 系统功能模块划分 PAGEREF _Toc296161495 h 10 HYPERLINK l _Toc296161496 2.4 系统流程分析 PAGEREF _Toc296161496 h 10 HYPERLINK l _Toc296161497 第三章

12、 详细设计说明 PAGEREF _Toc296161497 h 12 HYPERLINK l _Toc296161498 3.1 界面设计 PAGEREF _Toc296161498 h 12 HYPERLINK l _Toc296161499 3.1.1 界面的生成过程 PAGEREF _Toc296161499 h 12 HYPERLINK l _Toc296161500 3.1.2 生成的界面 PAGEREF _Toc296161500 h 13 HYPERLINK l _Toc296161501 3.2 初始化模块设计 PAGEREF _Toc296161501 h 14 HYPERL

13、INK l _Toc296161502 3.3 发送模块设计 PAGEREF _Toc296161502 h 17 HYPERLINK l _Toc296161503 3.4 接收模块设计 PAGEREF _Toc296161503 h 18 HYPERLINK l _Toc296161504 3.5 线程处理模块 PAGEREF _Toc296161504 h 18 HYPERLINK l _Toc296161505 3.6 结束模块 PAGEREF _Toc296161505 h 18 HYPERLINK l _Toc296161506 结 论 PAGEREF _Toc296161506

14、h 20 HYPERLINK l _Toc296161507 参 考 文 献 PAGEREF _Toc296161507 h 21 HYPERLINK l _Toc296161508 谢 辞 PAGEREF _Toc296161508 h 22引 言在互联网已经普及的今天,人们的生活和工作越来依赖信息网络。上网聊天、传送资料已经是人们生活中必不可少的东西。目前市场已有很多受人们的青睐优秀的聊天工具,例如QQ、MSN等。这些聊天软件大都基于windows平台开发的,而且也只能在window操作系统下运行。Linux操作系统本身具有很高的安全性,不易感染病毒,而且可移植性强,被很多专业人士所使用,

15、也应用于大多数的服务器,然而由于Linux并不能被普通人接受使得这一环境下开发的软件很少。Internet的迅猛发展,使得Linux操作系统被越来越多的人认识并使用。然而基于Linux操作系统平台的聊天传输软件非常之少,不能满足人们的需求,所以开发一款Linux操作系统下的聊天软件是很有必要的。本系统实现了在Linux操作系统下完成两台计算机的点对点传输功能,为两台运行Linux系统的电脑提供方便快捷的交流传输平台供用户使用,与此同时也增加了Linux的实用性。本系统将开发一款Linux下的聊天软件实现点对点传输功能。与成熟的聊天软件相比本系统能够完成的功能要少很多,但针对那些没有更多的功能需

16、求的用户,本系统占用资源比功能强大的聊天软件要少。第一章 主要技术简介1.1 LINUX简介 Linux操作系统是UNIX操作系统的一种克隆系统。它诞生于1991年的10月5日。由于Linux是开源和免费的,得到了广大计算机爱好者全力支持,现已成为今天世界上使用最多的一种UNIX类操作系统。其具有的 特点有:1、开放性:指系统遵循世界标准规范,特别是遵循开放系统互连(OSI)国际标准。2、多用户:是指系统资源可以被不同用户使用,每个用户对自己的资源(例如:文件、设备)有特定的权限,互不影响。3、多任务:它是指计算机同时执行多个程序,而且各个程序的运行互相独立。4、良好的用户界面 :Linux向

17、用户提供了两种界面,用户界面和系统调用。Linux还为用户提供了图形用户界面,它利用鼠标、菜单、窗口、滚动条等设施,给用户呈现一个直观、易操作、交互性强的友好图形化界面。5、设备独立性:是指操作系统把所有外部设备统一当作成文件来看待,只要安装它们的驱动程序,任何用户都可以像使用文件一样,操纵、使用这些设备,而不必知道它们的具体存在形式。Linux是具有设备独立性的操作系统,它的内核具有高度适应能力,提供了丰富的网络功能,完善的内置网络是Linux一大特点。6、安全性:Linux采取了许多安全技术措施,包括对读、写控制、带保护的子系统、审计跟踪、核心授权等,这为网络多用户环境中的用户提供了必要的

18、安全保障。7、良好的可移植性:是指将操作系统从一个平台转移到另一个平台,它仍然能按其自身的方式运行的能力。Linux是一种可移植的操作系统,能够在从微型计算机到大型计算机的任何环境中和任何平台上运行。1.2 SOCKET简介Socket通常也称作套接字,应用程序通常通过“套接字”向网络发出请求或者应答网络请求。Server Socket用于服务器端,Socket是建立网络连接时使用的,在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。Socket可以支持数据的发送和接

19、收,它会定义一种称为套接字的变量,发送数据时首先创建套接字,然后使用该套接字的sendto等方法对准某个IP/端口进行数据发送;接收端也要创建套接字,然后将该套接字绑定到一个IP/端口上,所有发向此端口的数据会被该套接字的recv等函数读出,如同读出文件中的数据一样。1.2.1 Socket的创建网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。常用的Socket类型有两种:流式Socket(SOCK_S

20、TREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。Socket建立为了建立Socket,程序可以调用Socket函数,该函数返回一个类似于文件描述符的句柄。Socket函数原型为:int Socket(int domain, int type, int protocol),其中domain指明所使用的协议族,AF_INET表示互联网协议族(TCP/IP协议族);type参数指定Socket的类型:SOCK_STREAM或SOCK_DGRAM,

21、Socket接口还定义了原始Socket(SOCK_RAW),允许程序使用低层协议;protocol通常赋值0。Socket()调用返回一个整型Socket描述符,可以在后面的调用使用它。Socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。调用Socket函数时,Socket执行体将建立一个Socket,实际上建立一个Socket,意味着为一个Socket数据结构分配存储空间。1.2.2 Socket工作过程Socket程序的工作过程可分为三个步骤:1、建立Socket连接:在通信开始之前由通信双方确认身份,建立一条专用的虚拟连接通道;2、数据通信:利用虚拟连接通道传送数据信息

22、进行通道;3、关闭:通信结束时,再将所建的虚拟连接拆除。1.2.3 Socket常用函数Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,可以用它们来开发TCP/IP网络上的应用程序。Socket编程中常用到的函数有:创建套接字Socket();将套接字与已知地址及端口绑定bind();设置监听Socket模式listen();请求建立连接connect();接受客户的连接请求accept();接受recv();发送send();关闭连接释放资源close()。1.3 GTKGTK(GIMP Toolkit)是一套用于创建图形用户界面的工具包,它遵循LGPL许可

23、证,所以可以用它来开发开源软件、自由软件,甚至是封闭源代码的商业软件,GTK是一个免费的工具包。GTK被称为GIMP工具包是因为最初写它是用来开发GNU图像处理程序)的,但是它现在已经被用于很多软件项目了,包括GNOME等。GTK是在 GDK(GIMPD rawing Kit)和gdk-pixbuf的基础上建立起来的,GDK基本上是对访问窗口的底层函数(在X窗口系统中是Xlib)的一层封装,gdk-pixbuf是一个用于客户端图像处理的库。GTK优势有:GTK得到了积极的开发与维护,围绕它有一个充满活力的社区,它本身提供了广泛的选项,用于把工作扩展到尽可能多的人,其中包括一个针对国际化、本地化

24、和可访问性的完善的框架。GTK简单易用,对开发人员和用户来说都是这样,它的设计良好、灵活而可扩展;它是自由软件,有一个自由的开放源码许可;它是可移植的,从用户和开发人员的角度都是这样。使用GTK的必要性:使用GTK+这样的库比起编写自己的GUI代码来有多个优势。例如,它可以显著节约开发时间,让开发人员把精力集中在项目真正重要和真正独特的地方,而不必重复公共的功能。对于用户来说,这意味着他们使用的应用程序之间具有更好的一致性:工具包能在哪使用,应用程序就能跟到哪里。就像使用LEGO一样,所有的人都使用同一兼容尺寸这一事实,意味着设计可以在使用库的人之间共享,不论他们在哪里使用它。1.4 GCC概

25、述GCC是一套由GNU开发的编程语言编译器。它是一套以GPL及LGPL许可证所发行的自由软件。GCC原名为GNU C语言编译器,因为它原本只能处理C语言。GCC很快地扩展,变得可处理C+,之后也变得可处理 Fortran、Pascal、Objective-C、Java,以及其他语言。GCC通常是跨平台软件的编译器首选。有别于一般局限于特定系统与执行环境的编译器,GCC在所有平台上都使用同一个前端处理程序,产生一样的中介码,因此中介码在各个其他平台上使用GCC编译,有很大的机会可得到正确无误的输出程序。GCC所遵循的部分约定规则:.c为后缀的文件,C语言源代码文件;.a为后缀的文件,是由目标文件

26、构成的档案库文件;.C,.cc或.cxx为后缀的文件,是C+源代码文件;.h为后缀的文件,是程序所包含的头文件;.i为后缀的文件,是已经预处理过的C源代码文件;ii为后缀的文件,是已经预处理过的C+源代码文件;.m为后缀的文件,是Objective-C源代码文件;.o为后缀的文件,是编译后的目标文件;.s为后缀的文件,是汇编语言源代码文件;.S为后缀的文件,是经过预编译的汇编语言源代码文件。1.5 TCP简介TCP与UDP同为传输层协议。本系统采用的传输协议TCP协议。本节不但提及到了TCP,而且对UDP也做了介绍。通过对比来加深对TCP与UDP的认识。TCP协议提供的是可靠的、面向连接的传输

27、控制协议,即在传输数据前要先建立逻辑连接,然后再传输数据,最后释放连接3个过程。TCP提供端到端、全双工通信;采用字节流方式,如果字节流太长,将其分段;提供紧急数据传送功能。TCP协议主要特点:1、面向连接的传输;2、端到端的通信;3、高可靠性,确保传输数据的正确性,不出现丢失或乱序;4、全双工方式传输;5、采用字节流方式,即以字节为单位传输字节序列;6、紧急数据传送功能;当然TCP并不是完美的,否则就没有人用UDP了。TCP最大的缺点是在传输数据时必须创建一个连接。这个连接通常给通信进程增加了开销,要比用UDP慢一些。正如比较两种极端的选择的时候常见的那样。一种选择的优点往往是另一种选择的缺

28、点。综合比较两种传输协议,TCP传输协议的高可靠性、面向连接的传输、端到端通信等优点,本系统最终采用了TCP协议。1.6 进程与线程1.6.1 进程进程的概念主要有两点:第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。

29、进程中包含和程序一样的指令和数据,进程也包含了程序计数器和所有CPU寄存器得值,同时他的堆栈中还存放着子程序参数、返回值以及变量之类的临时数据。Linux操作系统一般把进程分为3类,每种进程都有自己的特性和属性。1、交互进程:由一个shell启动的进程。交互进程即可以运行在前台,也可以在后台运行。2、批处理进程:这种进程和终端没有关系,是一个进程序列。3、精灵进程:Linux系统启动时的进程,在后台运行。1.6.2 线程线程是操作系统分配给处理器时间资源的基本单元。通常是在一个进程中包括多个线程,每个线程都是作为利用CPU的基本单位,是花费最小开销的实体。一个进程至少要包括一个线程,通常将该线

30、程成为主线程。一个线程从主线程的执行开始进而创建一个或多个附加线程,这就是所谓的基于多线程任务。线程编程的几个主要函数:Linux系统下的多线程遵循POSIX线程接口,称为pthread。在调用他们前均要包括pthread.h头文件。Pthread_create函数用于创建一个新线程,定义如下:int.pthread_cread (pthread_t*tid,const pthread_addr_t*attr, void*(*func)(void*),void*arg);第一个参数为指向线程ID的指针,类似于进程ID的使用,可以通过线程ID实现引用新线程;第二个参数用来设置线程属性,一般使用默

31、认即可,设置为NULL;第三个参数是线程运行函数的起始地址;最后一个函数是线程运行函数的参数。创建函数若执行成功,则返回0,若出现错误则返回非零值(错误码)。一般结束一个线程有两种途径:一种是线程的执行函数结束了,调用它的线程也就结束了;另一种方式是通过函数phtread exit来实现。Pthread_exit函数原型如下:Void pthread exit(void *retval);可以通过参数retval实现线程执行函数的返回值,只要pthread join中的第二个参数status不是NULL,那么retval的值将被传递给status。一个线程不能被多线程等待。参数retval可以

32、作为线程函数的返回值。任何进程在启动时就已有了一个主线程,如果需要再生成线程则使用g_thread_create()函数, 在该函数中可以指定线程的属性、线程例程、传给线程例程的参数。线程例程是一个用户自定义函数,即线程执行的代码。在gtk中当线程例程开始时,必须获得一个唯一的全局锁,可通过函数gdk threads enter()来获得,当线程例程返回时,必须释放该全局锁,可通过函数gdk threads leave()来释放。1.6.3 线程与进程的区别线程与进程的区别可以归纳为以下几点:1、地址空间和其它资源(如打开文件):进程间相互独立,同一进程的各线程间共享。进程内的线程在其它进程不

33、可见。2、通信:进程间通信IPC,线程间可以直接读、写进程数据段(如全局变量)来进行通信需要进程同步和互斥手段的辅助,以保证数据的一致性。3、调度和切换:线程上下文切换要比进程上下文切换要快得多。4、在多线程OS中,进程不是一个可执行的实体。综合比较进程与线程所能实现的功能和在系统运行时所占用的资源量,系统最终采用了线程来解决信息的收发能够并行进行的问题。1.7 图形界面生成工具介绍1.7.1 GladeGlade是一个构建GTK+/Gnome程序界面的工具,它是所见即所得的,同微软的Visual Studio中的界面设计工具类似。Glade的设计初衷就是要把把GTK+/Gnome程序的界面描

34、述从源代码中分离出来,她使用.glade文件来描述程序界面,这样的好处是使得后期修改程序界面变得非常容易,只需要使用Glade来调整界面,而无需对源程序做改动。这对于构建大型软件来说是相当重要的。开发者可将窗体构件作为画布,通过向画布添加界面构件设计程序界面。这种方式最大的优势在于设计的同时能直观地看到界面构件,并且可以随时调整界面的设计,设计界面如同画图一般。Glade使用GPL 协议发布,虽然是开源软件,但它的设计思想和易用性都领先于大多数商业集成开发环境中的界面设计工具。在Glade 的界面中,大部分常用GTK+界面构件被作为图标放在工具栏中。开发者如果需要向界面中添加某一个构件,只需从

35、工具栏上选添加了界面构件后,可直接在Glade中为界面构件设置属性,以及连接回调函数。设计的结果可保存为一个Glade界面项目文件,实际该文件是XML文件。1.7.2 GTK+1、主程序结构main.c程序,程序开始后申明一个结构指针GtkWidget *window1这是一个GTK+的专用结构,所有的如窗口、按钮、标签等都需要这样申明。后面的gtk_init (&argc, &argv)是初始化GTK,使你在终端窗口命令行参数传递给主程序。window1 = create_window1()是由子程序生成界面。gtk_widget_show(window1)是显示界面。gtk_main()是

36、主程序进入循环并监听信号,这一句十分重要,没有这一句则程序运行时会一闪而过。2、信号与回调函数GTK+以信号作为主程序与子程序交互、人机交互的通信手段,信号的种类在前面属性修改对话框中可以一览无余,如点击、按下、放开、离开等等。由不同信号联结callbacks中的不同函数,具体语句可在interface.c中见到第二章 系统设计2.1 开发需求2.1.1 运行环境操作系统:Red Hat Enterprise Linux 5编程语言:C界面生成工具:Glade2.1.2 客户需求通过对现有市场的聊天软件调查和分析,得知Linux系统下的聊天软件越来越受到人们的欢迎。针对这一需求开发了在Linu

37、x系统下可以运行的聊天软件。能够在两台安装有Linux操作系统的计算机下完成点对点传输任务,包括即时通信,传送文件两部分功能。系统启动进行初始化、连接,如果失败系统要给出提示问题可能出在那个环节,成功给出连接成功信息。在发送和接受信息时两个端点均不受对方接受和发送的干扰。要记录和显示一次连接所接收到的所有信息,并能够清除缓存内的内容。发送文件时,发送方可以通过点击系统界面上的浏览按钮浏览Linux操作系统下的文件夹,并找到所要发送的文件。通过点击发送按钮将文件发送到对方。接收方将所接受到的所有文件保存到系统默认的统一文件下。同时发送与接收到的文件名要保持一致。要求文件发送成功、失败均要给出提示

38、信息。需要结束程序时可以通过点击界面上的退出按钮来结束程序。2.2 系统功能描述服务器具有以下功能;1、服务器初始化,建立侦听,接受客户端连接;2、接收信息;3、接收文件;4、发送文件;5、向客户端发送信息和文件;6、关闭服务,并向客户端发送服务器关闭消息。客户端必须具有以下功能:1、连接服务器,发送用户连接请求;2、向服务器发送信息;3、接收文件;4、查找本地文件和发送文件;5、向服务器端发送信息和文件;6、关闭服务,并向服务器端发送客户端关闭消息。2.3 系统功能模块划分本系统共分为五个模块:界面模块:创建应用程序界面,显示接收信息和连接状态,接收用户输入。初始化模块:创建Socket套接

39、字描述符并把Socket和Socket地址结构联系起来。服务器端初始化Socket套接字包括规定所使用的TCP传输协议、绑定的端口及所使用的IP地址。客户端Socket初始化包括规定使用TCP传输协议、绑定端口。发送模块:发送消息和文件。将发送缓存内的信息通过函数发送给接收方。接收模块:接收消息和文件。首先要判定发送方将要发送的是文件还是消息。如果是消息将接收到的消息直接显示,如果是文件则将文件保存到程序默认目录下,并将显示连接状态和文件接收情况。线程处理模块:线程初始化、线程创建、线程控制。应用线程可以使发送与接收能够互不影响同步进行。结束模块:当传输工作结束需要退出系统时,系统要关闭所创建

40、的线程,释放用于连接的端口号,退出界面。其中点对点连接的任意一方在关闭程序时都要通知对方程序关闭,系统要将接到的对端断开连接的信息,同时通知程序使用者,等待是退出程序还是重新建立连接的命令。系统功能模块划分如图2-1所示。系统功能界面模块 创建连接模块接收模块 线程处理模块发送模块结束模块图2-1 系统功能模块示意图2.4 系统流程分析服务器端程序流程:1、初始化打开一个通信通道:本机将在某一公认的端口(8080)上等待客户(Client)请求;2、服务器进入阻塞等待状态,等待客户请求的到来;3、当服务器接收到一个客户的连接请求时,激活一个新的线程用于处理客户请求并建立C/S对话,服务完成后,

41、关闭此新线程与户的通信链路,并将其终止;4、返回第2步,等待另一客户请求;5、关闭服务器。服务器端流程图如图2-2所示。客户端程序流程图:1、指定想与之建立连接的服务器相应服务的保留端口号;2、向服务器发送connect请求并等待服务器的应答;3、接收到服务器建立连接的响应后接受服务器相应服务;4、服务请求结束后关闭通信通道并终止。客户端流程图如图2-3所示。图2-2 服务器端系统流程图 图2-3 客户端系统流程图第三章 详细设计说明3.1 界面设计3.1.1 界面的生成过程将界面设计好后,要为窗口内的每一个控件设置属性,包括触发的事件、所发出的信号、和调用的回调函数等。最后单击Glade主窗

42、口上的“联编”(Build)按钮,这样就会在本工程目录下自动生成所有关于界面的代码和回调函数原型。程序编译:打开终端,输入命令:$./autogen.sh完成后再输入make命令。Glade能够产生用来生成图形用户界面的所有文件。其中main.c文件是程序的主文件,它包含了C程序的初始化函数main(),窗口的创建语句window1=create_ window1 (),窗口的显示语句gtk_widget_show (window1)。glade生成的C源代码有:main.c,callbacks.c,interface.c,support.c,还有几个头文件:callbacks.h,inter

43、face.h,support.h。原代码全部位于工程的子目录 src 下。其中在interface.c声明了程序中使用到的参数和回调函数,而在callbacks.c中实现回调函数,想要实现窗口内各构件的具体功能还需要修改callbacks.c源代码。在callback.c文件内有所有的回调函数的函数体为空,要在函数体内写入所要执行的语句,其中自定义的函数也要写在callback.c里面。例如:选择文件按钮的回调函数Void on_button9_clicked(GtkButton *button,gpointer user_data)GtkWidget *fileselection1;if(i

44、sconnected=FALSE) return;fileselection1=create_fileselection1 (); gtk_widget_show (fileselection1);第一个参数是一个指向发出信号的构件的指针,第二个参数是一个指向数据的指针,是由信号连接函数的参数传进来的数据。函数体则完成文件选择构件的创建及显示功能。3.1.2 生成的界面本系统为服务器端和客户端设计了相同的主界面,在运行程序后通过主界面上的两个单选按钮,选择在连接中做为服务器端或客户端。同时在选择发送文件时也使用了相同发送文件界面。1、服务器端界面如图3-1所示。图3-1 服务器端主界面2、选择

45、发送文件界面如图3-2所示。图3-2 选择发送文件界面3、客户端界面如图3-3所示。图3-3 客户端主界面3.2 初始化模块设计通过主界面内选择服务器或客户端点击初始化按钮完成端点创建。服务器端建立端点后,创建Socket对象,绑定端口,监听连接。客户端建立端点后,同样创建Socket对象,向服务器端发出连接请求。服务端初始化后会创建一个套接字对象并给这个对象填充地址结构,包括所使用的网络协议、IP、端口号。使用bind()将套接字绑定到8080端口,开始监听连接请求。当有收到连接请求,定义客户端Socket地址结构client_addr。将accept()接收的客户端的Socket内容写入c

46、lient_addr中。连接成功要显示连接成功信息,同时配发一个新的线程用于接收信息。主要代码端如下:/程序段说明:首先定义一个套接字对象,给这个对象赋值来创建套接字,然后对这个套接字进行赋值。struct sockaddr_in my_addr;if(sockfd = Socket(AF_INET,SOCK_STREAM,0) = -1) perror(Socket); exit(1);my_addr.sin_family = AF_INET;my_addr.sin_port = htons(MYPORT);my_addr.sin_addr.s_addr = INADDR_ANY;bzero

47、(&(my_addr.sin_zero),8);/函数说明:将套接字和已知端口绑定if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr) = -1) perror(bind); exit(1);/监听函数:监听客户端请求,实现连接,创建多线程void listen_client(void)GtkTextIter iter;listen (server_fd,1);client_fd=accept(server_fd,(structsockaddr*)&client_addr, &addr_size);gdk_threa

48、ds_enter();gtk_text_buffer_get_end_iter(buffer2,&iter);gtk_text_buffer_insert(buffer2,&iter, IP地址为 ,-1);gtk_text_buffer_get_end_iter(buffer2,&iter);gtk_text_buffer_insert(buffer2,&iter,(gchar *)inet_ntoa(client_addr.sin_addr),-1);gtk_text_buffer_get_end_iter(buffer2,&iter);gtk_text_buffer_insert(buf

49、fer2,&iter, 的客户端已连接!n,-1);gdk_threads_leave();isconnected=TRUE;g_thread_create(GThreadFunc)get_message,NULL,FALSE,NULL);服务器端初始化程序流程如图3-4所示。图3-4 服务器端初始化模块程序流程图客户端初始化后同服务器端一样,要创建一个套接字对象并填充地址结构,绑定到8080端口,向服务器端发出连接请求,并显示连接是否成功。请求连接主要代码如下:/判断请求连接是否成功,显示相应信息。if(connect(server_fd,(struct sockaddr*)&server_

50、addr,len)=-1)gtk_text_buffer_get_end_iter(buffer2,&iter);gtk_text_buffer_insert(buffer2,&iter,连接服务器时出错!n,-1);return FALSE;elsegtk_text_buffer_get_end_iter(buffer2,&iter);gtk_text_buffer_insert(buffer2,&iter,成功与服务器连接n,-1);isconnected= TRUE;return TRUE;客户端初始化模块程序流程如图3-5所示。图3-5 客户端初始化模块程序流程图3.3 发送模块设计发

51、送模块由发送消息和发送文件两部分构成。其中发送消息部分可以通过在回调函数内使用sprintf()、write()等函数,实现信息的发送和显示。发送按钮的回调函数被调用时首先判断是要执行服务器端,还是客户端代码。服务器端与客户端发送信息模块代码,主要区别在于发送时所使用的套接字对象不同,服务器端使用的Socket对象为client_fd,客户端使用的Socket对象为server_fd。清除按钮能够删除所显示的信息。发送文件部分使用选择文件按钮调用选择文件窗口,实现文件查找,选择想要发送的文件,将选择要发送文件的路径和文件名显示在发送文件对话框中。发送按钮调用文件发送函数将选择的文件发送到接收方

52、。文件发送函数同信息发送函数一样,要判断选择执行服务器端和客户端发送代码。发送模块运行过程如图3-6所示。图3-6 发送模块流程图3.4 接收模块设计接收模块使用get_message()函数进行接收。当get_message()运行时首先会判断是服务器端,还是客户端的调用,根据判断结果执行不同的代码段。在接收到信息后要判断发送方想要传送的是文件还是消息,再次选择执行不同的代码段。接收文件需要调用filereav()函数,filereav()执行过程如下首先接收文件名,用接收到的文件名命名创建一个文件,将接收缓存buffer中的内容写入创建的文件中,最后关闭文件。发送模块运行过程如下图3-7所

53、示。图3-7 接收模块流程图3.5 线程处理模块线程处理模块是在主界面显示后,进入gtk_main()等待事件、信号的触发。服务器端在初始化创建Socket对象成功后,创建一个线程用于监听连接请求,当服务器端与客户端连接成功后再创建一个线程用于接收信息。任何进程在启动时就已有了一个主线程,需要再生成线程则使用g_thread_create()函数,在该函数中可以指定线程的属性、线程例程、传给线程例程的参数。线程例程是一个用户自定义函数,即线程执行的代码。当线程例程开始时,必须获得一个唯一的全局锁,可通过函数gdk_threads_enter()来获得, 当线程例程返回时,必须释放该全局锁,可通过函数gdk_threads_leave()来释放。3.6 结束模块通过点击图形界面上的退出按钮退出程序。在执行退出按钮的回调函数时,首先要判断连接是否成功过,如果没有连接则直接关闭Socket对象,调用gtk_main_quit()退出程序销毁界面。如果服务器端与客户端处于连接状态则要判断是服务器端还是客户端。服务器结束要将服务器退出信息发送给客户端,关闭用于监听和用于连接客户端的两个Socket,然后退出程序。客户端结束要将客户端退出信息发送给服务器,关闭与服务器连接的Socket释放占有的系统资源,退出程序销毁界面。结束模块程序流程如图3-8所示。图3-8 结束模块

温馨提示

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

评论

0/150

提交评论