基于局域网的文件传输系统的设计与实现 论文定稿

更新时间:2024-05-26 16:25:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

本科毕业设计(论文)

题目:基于局域网的文件传输系统的

设计与实现

院 (系): 电子信息工程学院 专 业: 通信工程 班 级: 学 生: 学 号: 指导教师:

2012年 6月

基于局域网的文件传输系统的设计与实现

摘 要

在这个信息化时代,计算机网络技术的迅猛发展影响了几乎包括政治、文化、生活、经济在内的每一个角落,推动了人类社会向信息化社会的逐步转变;同时我们也应该清醒地认识到文件传输的问题是计算机网络发展过程中的一个不容忽视的问题。在如今拥塞的网络上,各种数据在争夺着网络资源,如何使传输的文件更加可靠的到达目的地,同时如何友好的解决文件分类分组高效传输等问题都是需要有待提高和完善的地方。很多情况下,人们的日常工作需要借助文件传输来完成。但大多数文件传输功能都需要借助移动磁盘等硬件设备或Internet上的服务器才能实现。这就给那些具有大规模内部网络的用户造成了许多问题,如浪费资金、浪费网络资源、病毒入侵、降低了工作效率等。为了方便局域网内主机的资源共享,需要开发一个基于局域网的文件传输工具,在内部网络中实现文件交换。

本文件传输系统的设计选用VC++6.0为开发工具,以C/S模式通过建立Socket连接后实现局域网快速,准确,安全的点对点文件传输功能。本系统能够促进局域网内用户之间的文件资源共享,满足主机之间信息交流,确保文件传输安全性,有效地提高工作效率。

关键字:套接字;网络编程;C/S模式;TCP/IP

I

Design and implementation of file transfer system based on

local area network

Abstract

In this information era, the rapid development of computer network technology has affected every corner almost, including politics, culture, life, economic, and promote the gradual transformation of human society to information society; We should also clearly recognize that the file transfer problem is a problem not to be ignored in the development of computer networks. In today's congested network, various data competing for network resources, how to make transmission more reliable, and how to resolve the efficient problem is need to be improved and perfected. In many cases, people's daily work is required to use file transfer to complete. But most of the file transfer capabilities require the removable disks and other hardware devices or servers on the Internet. This caused many problems for those large-scale internal network users, such as a waste of money, a waste of network resources, virus attacks, reduced work efficiency. In order to facilitate the sharing of resources of the host in the LAN, We need to develop a LAN-based file transfer tool for document exchanged in the internal network.

The file transfer system design uses VC++6.0 as development tools. By creating a C/S Socket connection to realize fast, accurate, secure peer-to-peer file transfer capabilities. The system can promote the sharing of files between the LAN user to meet the exchange of information between the host and ensure the file transfer security, and effectively improve work efficiency.

Key Words: Socket;Network programming;C/S mode;TCP/IP

II

目 录

摘 要 ............................................................................................................................ I ABSTRACT ............................................................................................................. II 1 绪论 ....................................................................................................................... 1

1.1前言 .................................................................................................................. 1 1.2国内外研究现状 .............................................................................................. 1 1.3课题研究的意义 .............................................................................................. 1 1.4本文主要研究内容 .......................................................................................... 2

2 系统需求分析 .................................................................................................... 3

2.1现行业务系统描述 .......................................................................................... 3 2.2现行系统主要存在的问题分析 ...................................................................... 3 2.3提出解决方案 .................................................................................................. 3

3 TCP/IP协议 ....................................................................................................... 5

3.1开放式系统互连参考模型 .............................................................................. 5 3.2 TCP/IP技术 ..................................................................................................... 5

3.2.1 TCP/IP体系结构 .......................................................................................... 6 3.2.2 IP协议............................................................................................................ 7 3.2.3 TCP协议 TCP/IP特点 .............................................................................. 7 3.2.4 TCP/IP传送文件机制 ................................................................................. 8

4 SOCKET网络程序设计技术 .................................................................... 10

4.1 SOCKET编程 ................................................................................................... 10

4.1.1 Winsock简介 .............................................................................................. 10 4.1.2 Winsock通信机制 ..................................................................................... 11 4.1.3 Winsock编程模型 ..................................................................................... 13 4.2主要函数介绍 ................................................................................................ 15 4.3 C/S构架 ......................................................................................................... 20

III

4.3.1 C/S构架软件的优势与劣势 .................................................................... 20

5 软件开发 ............................................................................................................ 22

5.1程序功能分析 ................................................................................................ 22 5.2系统总体架构 ................................................................................................ 22 5.3设计流程图 .................................................................................................... 22 5.4系统功能模块设计 ........................................................................................ 25

5.4.1软件设计 ...................................................................................................... 25 5.4.2服务器模块 ................................................................................................. 25 5.4.3客户端模块 ................................................................................................. 28

6 软件实现与测试 .............................................................................................. 30 7 总结 ..................................................................................................................... 34 致 谢 .......................................................................................................................... 35 参考文献 ................................................................................................................... 36 毕业设计(论文)知识产权声明 .................................................................... 37 毕业设计(论文)独创性声明 ......................................................................... 38

IV

1 绪论 1 绪论

1.1前言

当今世界科学技术飞速发展,尤其以计算机通信网络为代表的互联网技术更是日新月异,令人眼花燎乱,目不睱接。在计算机与网络迅速发展的今天,借助于网络进行信息资源交流给人们带来了极大的方便。随着互联网技术的迅猛发展,计算机通信给人类文明带来了翻天覆地的变化。很多情况下,人们的日常工作需要借助文件传输来完成。但大多数文件传输功能都需要借助移动磁盘等硬件设备或Internet上的服务器才能实现。这就给那些具有大规模内部网络的用户造成了许多问题,如浪费资金、浪费网络资源、病毒入侵、降低了工作效率等。为了方便局域网内主机的资源共享,需要开发一个基于局域网的文件传输工具,在内部网络中实现文件交换。

1.2国内外研究现状

目前,国内外企业对局域网的文件传输系统认识和使用情况并不好,各个企业单位在局域网内实现文件传输,资源共享还有很大的缺陷。技术无论是从理论上或实践上都还不够完善。文件传输系统由于比较复杂,可变因素较多,安全性低,因此发展还不成熟。

但是随着科学技术的发展,各种以局域网为单位的文件传输系统已经进入稳健发展期,比如说市面上比较普遍使用的QQ、UC、飞鸽传书等以内部网络为中心的资源共享系统也即将进入高速发展期。在国内,随着企业资源管理的规范化和规模的不断扩大,企业的计算机资源管理将不仅仅停留在依靠硬件或者Internet网络获取,而且将会向着安全的内部网络化资源管理方式迈进。

1.3课题研究的意义

随着网络通信技术的发展与用户需求日益多样化,现代局域网络正处在变革与发展之中,本课题的主要目的之一是为了更清晰地培养学生掌握科学研究方法的能力和使学生迅速体会文件传输系统的研发过程。基于局域网的文件传输系统能够让家庭网络以及各个企业等局域网对内部资料有一个快捷,准确,安全的共享。特别是对如今较大系统研发的模块分工合作得到了绝对保密性,从而使各项工作有计划、更科学的进行及顺利完成,使企业的办事效率得到显著提高。文件传输系统主要功能是自动获取局域网内用户的主机名,IP地址以及工作组名字,最终以C/S模式通过TCP/IP协议实现点到点文件传输功能。本系统既锻炼了我们的实际动手能力,使我们将大学四年所学的理论知识与实际开发相结合,又引

1

西安工业大学毕业设计(论文) 导我们进行了一次模拟实际产品的开发,对于我们以后工作能力的培养具有重要的意义。

1.4本文主要研究内容

计算机文件属于文件的一种,与普通文件载体不同,计算机文件是以计算机硬盘为载体存储在计算机上的信息集合。文件可以是文本文档、图片、程序等等。文件通常具有三个字母的文件扩展名,用于指示文件类型(例如,图片文件常常以 JPEG 格式保存并且文件扩展名为 .jpg)。文件传输需要经过两个步骤,一是网络的链接;二是文件的传输。本文提出的方案主要是在满足局域网内链路状态良好,IP地址已知的条件下的文件传输。

2

2 系统需求分析 2 系统需求分析

2.1现行业务系统描述

目前各种文件资源交流的主要方式可以分为三种:(1)通过局域网内主机之间以文件共享后再经过复制,粘贴方式实现。(2)依靠可移动磁盘的两次信息转移实现。(3)通过Internet邮件方式实现。此三种方法并非不可行,但它们都需要花费较长的时间以及安全性也得不到保证,工作效率将在很大程度上受到限制。

如果通过局域网内主机之间复制粘贴来实现文件资源共享,将浪费大量的网络带宽,极大程度上影响了网内用户的工作效率,甚至导致用户不能正常工作;如果依靠移动磁盘实现文件的共享,将花费大量的金钱,而文件较大移动磁盘容量不足的情况下会令人极为头疼,何况移动磁盘是病毒传播的重要途径;如果通过Internet邮件方式实现,用户需要接入Internet服务器,这种方式对远程服务器有非常大的依赖性,即使1KB的文件都要经历极度繁琐的路径,不能彻底实现点对点的即时交流,文件较大的情况下就不言而喻了。最重要的是,在如今病毒黑客横行的网络世界中,信息的安全性也得不到保证。

综上所述,依靠Internet网络等方式实现文件资源交互的准确性,快速性及安全性远达不到理想的要求。

2.2现行系统主要存在的问题分析

针对企业来说,提高工作效率是企业的一个重心;降低成本是企业赢取最大利益的重要方式;保证信息安全却是可能影响企业生死存亡的关键。企业需要对各种因素有足够深刻的认识才可能实现最终目标---盈利。而传统的文件资源交互方式却存在很多的问题,大致可以分为:一、不能有效地降低文件交互成本;二、文件交换过程过于繁琐;三、内部机密资料得不到安全保证;四、文件交互的准确性得不到根本保证。

2.3提出解决方案

解决当前问题的方案主要是指在允许的成本、性能要求下,分析系统实施的可行性,提出功能实现的依据,包括其简单性,安全性以及经济可行性。根据企业简单快速,安全的资源共享等要求,提出以下四种解决方案:

1)操作简单性方案:开发的系统需要有以下特点:Windows友好的用户界面和系统快速的应用方法,简单易操作,不需对使用人员进行培训,可以使用户很好的掌握。对传输文件过程中的文件的载入设置都是非常简单可行,比如:如

3

西安工业大学毕业设计(论文) 果用户忘记选择文件接收者的时候系统会自动提示“请选择接收用户”要求用户选择主机而不导致错误出现而引发的不便,这样就大大提高工作效率。而且开发的系统应该简单易操作,易维护,减少了不必要的麻烦。对于家庭局域网以及一些比较简单的中小企业网,系统必须做到在实际应用中较为成功。系统应为用户提供Windows所一贯坚持的非常友好、操作简单的用户界面。

2)传输安全性方案:系统开发完成后,能有效地使内部资源与外网的完全隔离,从而保证了内部机密文件的安全性。

3)经济可行性方案:系统开发完成必须作到提高文件共享效率,不管是在资金上还是效率上都能达到预期的效果的。最重要的一点就是:使用户避免花费高额的资金去购买各种移动磁盘甚至是通过Internet邮件方式,使得用户方便的同时,也让信息少走了不少“弯路”。 4)快速准确性方案:鉴于系统的目标要求和特点,能够保证快速准确地实现文件共享。

综合上述,本设计在Windows XP操作系统下,以中文版c++6.0为开发工具,以C/S为系统功能结构,基于点对点的TCP/IP协议理论,通过Socket套节字连接客户端与服务器实现文件及文件夹传输。彻底避免了文件交换过程与外部网络的接触,实现快速的文件资源共享。并能够确保内部文件的机密性,能够在很大程度上有效地提高工作效率。

4

3 TCP/IP协议 3 TCP/IP协议

3.1开放式系统互连参考模型

TCP/IP 是Transmission Control Protocol/Internet Protocol 的简写,中文译名为传输控制协议/互联网协议,是当今世界上最广而不基于任何特定硬件平台的网络通信协议.采用TCP/IP 可以解决异种机联网和异种网互连的问题,并可以访问当今世界上最有影响力的Internet 网TCP/IP 协议的基本思想,是通过网间连接层将各种不同的网络连接起来,在各个网络的底层协议之上构造一个虚拟的大网,使用户与其他网的通讯就像与本网的主机通讯一样方便实现,这一思想的相关协议有TELNET、FTP、SMTP、TCP、UDP、IP、ICMP、ARP、RARP 等。

TCP/IP协议并不完全符合OSI的七层参考模型。传统的开放式系统互连参考模型,是一种通信协议的7层抽象的参考模型,其中每一层执行某一特定任务。该模型的目的是使各种硬件在相同的层次上相互通信。这7层是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。而TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。这4层分别为:

应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。 传输层:在此层中,它提供了节点间的数据传送,应用程序之间的通信服务,主要功能是数据格式化、数据确认和丢失重传等。如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。 互连网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。 网络接口层(主机-网络层):接收IP数据报并进行传输,从网络上接收物理帧,抽取IP数据报转交给下一层,对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。

3.2 TCP/IP技术

TCP/IP是Transmission Control Protocol/Internet Protocol的简写,中文译名为传输控制协议/互联网协议,是当今世界上最广而不基于任何特定硬件平台的网络通信协议。采用TCP/IP可以解决异种机联网和异种网互连的问题,并可以访问当今世界上最有影响力的Internet网。TCP/IP协议的基本思想是通过网间连接层将各种不同的网络连接起来,在各个网络的底层协议之上构造一个虚拟的大

5

西安工业大学毕业设计(论文) 网,使用户与其他网的通讯就像与本网的主机通讯一样方便实现,这一思想的相关协议有TELNET、FTP、SMTP、TCP、UDP、IP、ICMP、ARP、RARP等。 3.2.1 TCP/IP体系结构

TCP/IP协议实际上就是在物理网上的一组完整的网络协议。其中TCP是

提供传输层服务,而IP则是提供网络层服务。TCP/IP包括以下协议(结构如图3-1所示):

图3-1 TCP/IP协议体系结构

IP: 网间协议(Internet Protocol) 负责主机间数据的路由和网络上数据的

存储。同时为ICMP,TCP,UDP提供分组发送服务。用户进程通常不需要涉及这一层。

ARP: 地址解析协议(Address Resolution Protocol)此协议将网络地址映射到

硬件地址。

RARP: 反向地址解析协议(Reverse Address Resolution Protocol)此协议将硬件地址映射到网络地址。

ICMP: 网间报文控制协议(Internet Control Message Protocol)此协议处理信关

和主机的差错和传送控制。

TCP: 传送控制协议(Transmission Control Protocol)这是一种提供给用户进

程的可靠的全双工字节流面向连接的协议。它要为用户进程提供虚电路服务,并为数据可靠传输建立检查。(注:大多数网络用户程序使用TCP)。

UDP: 用户数据报协议(User Datagram Protocol)这是提供给用户进程的无连

6

西安工业大学毕业设计(论文) 接协议,用于传送数据而不执行正确性检查。

FTP: 文件传输协议(File Transfer Protocol)允许用户以文件操作的方式(文

件的增、删、改、查、传送等)与另一主机相互通信。

SMTP: 简单邮件传送协议(Simple Mail Transfer Protocol)SMTP协议为系统

之间传送电子邮件。

TELNET:终端协议(Telnet Terminal Protocol)允许用户以虚终端方式访问远程

主机。

HTTP: 超文本传输协议(Hypertext Transfer Protocol)。是用于从WWW服务器

传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少

TFTP: 简单文件传输协议(Trivial File Transfer Protocol)。它是TCP/IP协议族

中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不

复杂、开销不大的文件传输服务。

3.2.2 IP协议

网际协议IP是TCP/IP的心脏,也是网络层中最重要的协议。IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层---TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。 高层的TCP和UDP服务在接收数据包时,通常假设包中的源地址是有效的。也可以这样说,IP地址形成了许多服务的认证基础,这些服务相信数据包是从一个有效的主机发送来的。IP确认包含一个选项,叫做IP source routing,可以用来指定一条源地址和目的地址之间的直接路径。对于一些TCP和UDP的服务来说,使用了该选项的IP包好像是从路径上的最后一个系统传递过来的,而不是来自于它的真实地点。这个选项是为了测试而存在的,说明了它可以被用来欺骗系统来进行平常是被禁止的连接。那么,许多依靠IP源地址做确认的服务将产生问题并且会被非法入侵。 3.2.3 TCP协议 TCP/IP特点

TCP/IP协议的核心部分是传输层协议(TCP、UDP),网络层协议(IP)和物理接口层,这三层通常是在操作系统内核中实现,因此用户一般不涉及。编程时,编程界面有两种形式:一、是由内核心直接提供的系统调用;二、使用以库函数方式提供的各种函数。前者为核内实现,后者为核外实现。用户服务要通过核外的应用程序才能实现,所以要使用套接字(Socket)来实现,下图3-2就是反映TCP/IP协议核心与应用程序的关系。

7

西安工业大学毕业设计(论文) 应用程序1应用程序2网络页面编程界面(SOCKET)TCP/IP核心协议物理介质

图3-2 TCP/IP协议的核心与应用程序关系

3.2.4 TCP/IP传送文件机制

下面以采用TCP/IP协议传送文件为例,说明TCP/IP的工作原理,其工作流程如下:

(1)在源主机上,应用层将一串应用数据流传送给传输层。

(2)传输层将应用层的数据流截成分组,并加上TCP报头形成TCP段,送交网络层。

(3)在网络层给TCP段加上包括源、目的主机IP地址的IP报头,生成一个IP数据包,并将IP数据包送交链路层。

(4)链路层在其MAC帧的数据部分装上IP数据包,再加上源、目的主机的MAC地址和帧头,并根据其目的MAC地址,将MAC帧发往目的主机或IP路由器。

(5)在目的主机,链路层将MAC帧的帧头去掉,并将IP数据包送交网络层。 (6)网络层检查IP报头,如果报头中校验和与计算结果不一致,则丢弃该IP 数据包;若校验和与计算结果一致,则去掉IP报头,将TCP段送交传输层。 (7)传输层检查顺序号,判断是否是正确的TCP分组,然后检查TCP报头数据。若正确,则向源主机发确认信息;若不正确或丢包,则向源主机要求重发信息。

(8)在目的主机,传输层去掉TCP报头,将排好顺序的分组组成应用数据流送给应用程序。这样目的主机接收到的来自源主机的字节流,就像是直接接收来自源主机的字节流一样。

如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向‘上’传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可

8

西安工业大学毕业设计(论文) 以被重传。TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。面向连接的服务(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它们使用了TCP。DNS在某些情况下使用TCP(发送和接收域名数据库),但使用UDP传送有关单个主机的信息。

9

4 Socket网络程序设计技术 4 Socket网络程序设计技术

4.1 Socket编程

文件传输系统得以实现的根本在于建立有效的连接以及是否存在文件传输载体。所谓Socket通常也称作\套接字\,用于描述IP地址和端口,socket类表现了客户端套接字,它是属于两台计算机的两个TCP通讯端口之间的通讯通道。在网络编程中,客户端使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口。服务器使用Socket监听指定的端口,端口可以随意指定,等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。 4.1.1 Winsock简介

以U.C. Berkeley大学BSD UNIX中流行的Socket接口为范例定义了一套microsoft Windows下网络编程接口。它不仅包含了人们所熟悉的Berkeley Socket风格的库函数;也包含了一组针对Windows的扩展库函数,以使程序员能充分地利用Windows消息驱动机制进行编程。Windows Sockets规范本意在于提供给应用程序开发者一套简单的API,并让各家网络软件供应商共同遵守。此外,在一个特定版本Windows的基础上,Windows Sockets也定义了一个二进制接口

(ABI),以此来保证应用Windows Sockets API的应用程序能够在任何网络软件供应商的符合Windows Sockets协议的实现上工作。因此这份规范定义了应用程序开发者能够使用,并且网络软件供应商能够实现的一套库函数调用和相关语义。遵守这套Windows Sockets规范的网络软件,我们称之为Windows Sockets兼容的,而Windows Sockets兼容实现的提供者,我们称之为Windows Sockets提供者。一个网络软件供应商必须百分之百地实现Windows Sockets规范才能做到现Windows Sockets兼容。任何能够与Windows Sockets兼容实现协同工作的应用程序就被认为是具有Windows Sockets接口。我们称这种应用程序为Windows Sockets应用程序。Windows Sockets规范定义并记录了如何使用API

与Internet协议族(IPS,通常我们指的是TCP/IP)连接,尤其要指出所有的 Windows Sockets实现都支持流套接口和数据报套接口。应用程序调用Windows Sockets的API实现相互之间的通讯。Windows Sockets又利用下层的网络通讯协议功能和操作系统调用实现实际的通讯工作。

为了方便网络编程,Microsoft联合了其他几家公司共同制定了一套WINDOWS下的网络编程接口,即Windows Sockets规范,它不是一种网络协议,而是一套开放的、支持多种协议的Windows下的网络编程接口。现在的Winsock已经基本上实现了与协议无关,你可以使用Winsock来调用多种协议的功能,但

10

西安工业大学毕业设计(论文) 较常使用的是TCP/IP协议。Socket实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有Socket接口的计算机通信。应用程序在网络上传输和接收的信息都通过这个Socket接口来实现。

Winsock规范定义了一套可使网络程序开发人员在Windows下开发标准的TCP/IP网络程序接口,它不仅包含人们所熟悉的Berkeley Socket风格的库函数,还包含了一组针对Windows的扩展库函数,以使程序员能充分地利用Windows消息驱动机制、异步网络事件选择方式进行编程。Winsock规范定义并记录了任何使用API与Internet通讯协议(ISP通常指TCP/IP)连接。应用程序使用Windows Sockets的API,而Windows Sockets又利用下层的网络通信协议与操作系统以产生实际的通信,它们之间的关系如下图4-1所示。

应用程序1应用程序2应用程序3网络程序接口(Windows Sockets)网络通信程序接口(TCP/IP)操作系统

图4-1 应用程序与windows sockets 关系图

4.1.2 Winsock通信机制

应用程序的网络通信归根结底是利用相同的通信协议来完成信息的传输,应用程序和Winsock都工作在Windows的用户模式下,操作系统仅仅通过Winsock是不能完成网络间的通信,还需要底层的支持,而套接字仿真器(套接字核心模式驱动程序)和传输驱动程序接口(Transport Driver Interface,TDI)是负责操作系统核心态环境下的网络通信,起到了Winsock和传输协议之间的通信桥梁作用。如图4-2所示,Winsock是网络通信应用程序于套接字仿真器间的接口,TDI是套接字仿真器和传输协议间的接口套接字核心模式,驱动程序复杂连接和缓冲区管理,以便向应用程序提供套接字仿真(在AFDSYS文件中实现),同时负责

11

西安工业大学毕业设计(论文) 与底层传输驱动程序对话传输驱动程序接口(TDI)负责核心模式驱动程序与传输协议间的通信。

应用程序套接字套接字仿真器传输驱动程序接口传输协议

图4-2 套接字通信机制示意图

当应用程序利用Winsock发送和接受数据时,并不是由Winsock从网络上发送和接收数据的,而是由核心模式驱动程序AFDSYS负责管理发送和接收缓冲区来发送和接收数据。也就是说,当应用程序调用send或WSASend函数来发送数据时,AFDSYS将把数据复制进他自己的发送缓冲区,然后send后WSASend函数立即返回AFDSYS在后台负责把数据发送出去,远程客户端接收数据的情况也类似,由接收方的AFDSYS在后台负责把数据复制到自己的接收缓冲区,然后当应用程序调用recv后WSARecv函数来接收数据时,把数据由AFDSYS管理的接收缓冲区复制到应用程序提供的缓冲区中。 AFDSYS管理的发送缓冲区SO-SNDBUF和接收缓冲区SO-RCVBUF在缺省时两个缓冲区的大小都为8192个字节,但可以根据实际要求由应用程序设定,由于我们传输的对象可能是大数据量文件,因此需要对系统的发送缓冲区和接收缓冲区作相应的设定,以保障大数据量的文件数据的发送和接收。

Sockets的实质是通信端点的一种抽象,它提供一种发送和接受数据的机制。根据通信性质不同可分为:Stream Sockets(流式套接字)和Datagram Sockets(数据报套接字),如图4-3所示为这两种套接字的基本通信方式。其中Stream Sockets提供无差错的、面向连接的、无长度限制的双向字节流传输,适应于处理大量数据,尤其适合于FTP服务。Datagram Sockets支持双向的数据传输、但传输过程中不能保证可靠性和无差错性;本设计的程序设计中选择Stream Sockets来完成C/S模式的通信,保证能够数据准确、无误的传输。

12

西安工业大学毕业设计(论文) ServerServerSocket()Socket()Bind()Bind()Client()Listen()Recvfrom()Socket()acceptClient()Blocks untilConnection fromclientSocket()Blocks until dataReceived fromclientBind()Connect()Send to()Read()Writer()Process requestProcess requestWrite()Read()面向连接的流方式Send to()Recvfrom()非连接的数据包方式

图4-3 Socket的两种通信方式

4.1.3 Winsock编程模型

a.建立一个Socket

为了建立Socket,程序调用Socket函数如下:

Socket—handle=Socket(“协议簇”,“Socket类型”,“协议”);

13

西安工业大学毕业设计(论文) Winsock函数含有三个参数,“协议簇”参数指明像TCP/IP协议组这样的一组相关协议,“Socket类型”参数指明参数指明程序是进行数据报传输还是字节流传输,“协议”参数定义了协议族内程序欲使用的具体协议(如TCP或UDP)。 由于编程时必须指定程序使用的协议簇,因而能够为使用不同协议组和地址格式的网络建立相同的接口。也就是说,本函数的正确调用可使Winsock接口运行在多个网络上。下面语句显示了一个典型的具体Winsock函数调用:

Socket—handle=Socket(PF—INET,SOCK—STREAM,IPPROTO—TCP); 这个Winsock使用Internet协议簇(PF—INET)的TCP协议(IPPROTO—TCP)进行字节流(SOCK—STREAM)通信。当程序调用Winsock函数建立一个新Socket时,Winsock将为一个内部数据结构分配内存,此结构中保存有关此Socket的信息。

b.配置一个Socket

程序可使用Winsock中不同的函数来配置一个Socket。每个Socket需要五种信息:本地和远地本机的IP地址、本地和远地进程的协议端口、连接使用的协议。

面向连接的协议在连接端点之间建立一条虚电路,面向连接的客户程序不必关心网络软件使用怎样的本地地址传输数据。建立好连接后,客户程序依靠TCP协议给它传送数据。因此面向连接的客户程序不需指明本地协议端口,它提供给Socket的唯一地址信息是远地服务器信息(IP地址和协议端口)。Winsock自动保存本地IP地址和选择本地协议端口,并确保客户程序收到传输层送给本地协议端口的所有数据。也就是说,Winsock为程序选择协议端口,当数据到达此端口时通知程序,程序不必关心Winsock使用哪一个协议端口。

在前一步已建立的Socket基础上,面向连接的客户程序使用connect函数来配置Socket。

result=connect(“Socket句柄”,“远地Socket地址”,“远地Socket地址”); 此时,内部数据结构就包含了网络通信必须的五种信息。只有面向连接的客户进程才启动与远地服务器Socket的直接连接。

无连接协议不建立与远地服务器的直接连接。使用无连接协议的客户程序必须发送一个带有服务请求的数据报并等待应答,远地服务器的应答以数据报的形式到达。Winsock用bind函数给Socket指定一个本地IP地址和一个协议端口,其典型调用如下:

result=bind(“Socket句柄”,“本地Socket地址”,“本地Socket地址长度”); 服务器程序使用bind函数用Winsock登记一个协议端口,程序告诉Winsock监视哪一个协议端口的数据传送,Winsock接着告诉传输层将此协议端口收到的数据传送给Winsock。

c.使用Socket

14

西安工业大学毕业设计(论文) 配置好一个Socket后,程序就能够使用Winsock在网络上传送和接收数据了。Winsock有四个函数:两个用于数据传送(send、sendto),两个用于数据接收(recv、recvfrom)。由于send和recv函数不能指定目的地址,只能用于面向连接的Socket,其典型调用过程为:

result=send(“Socket句柄”,“报文缓冲区”,“缓冲区长度”,“特殊标志”);

Winsock将从Socket句柄确定的内部Socket数据结构中获取目的地址信息,接着send函数将传送报文缓冲区中的数据,这些数据将被传送到Winsock内部Socket数据结构中指明的网络地址中去。recv函数与之相对应,其调用过程为: result=recv(“Socket句柄”,“报文缓冲区”,“缓冲区长度”,“特殊标志”); 程序在无连接的Socket上使用sendto和recvfrom函数,其使用如下: result=sendto(“Socket句柄”,“报文缓冲区”,“缓冲区长度”,“特殊标志”,“Socket地址结构”,“地址结构长度”); result=recvfrom(“Socket句柄”,“报文缓冲区”,“缓冲区长度”,“特殊标志”,“Socket地址结构”,“地址结构长度”); sendto函数在Winsock的内部数据结构中保存远地服务器信息,在程序调用sendto函数之前,必须在一个Socket数据结构中保存远地服务器信息,程序将此地址结构的指针传递给sendto函数。当Winsock需要传输层传送sendto报文缓冲区中的数据时,Winsock将其内部数据结构保存的信息传送给传输层,传输层使用此数据结构中的信息格式化UDP数据报头,并将此数据通过网络传送。使用recvfrom函数的服务器需要分离出发送者的地址,客户程序使用recvfrom函数时,如果客户想继续进行网络对话,就需要分离出发送者的地址。

“特殊标志”参数使用符号常数MSG—OOB作为标志值,表示可以从协议端口请求带外数据。带外数据是程序必须立即处理的紧急数据,如存在带外数据,函数立即将紧急数据返回给程序,如果没有带外数据,函数返回常数错误值 EINVAL。若“特殊标志”参数使用符号常数MSG—PEEK作为标志值,表示可以对传输层输入队列中的数据进行分析。如果不需使用这两个标志,可将“特殊标志”参数指定为0。

4.2主要函数介绍

Accept:

定义函数:

int accept(int s,struct sockaddr * addr,int * addrlen);

函数说明:

accept()用来接受参数s的socket连线。参数s的socket必需先经bind()、listen()函数处理过,当有连线进来时accept()会返回一个新的socket处理代码,往后的数据传送与读取就是经由新的socket处理,而原来参数s的socket能继续使用accept()来接受新的连线要求。连线成功时,参数addr所指的结构会被系统填入

15

西安工业大学毕业设计(论文) 远程主机的地址数据,参数addrlen为scokaddr的结构长度。

返回值: 成功则返回新的socket处理代码, 失败返回-1,错误原因存于errno中。 错误代码:

EBADF 参数s非合法socket处理代码。

EFAULT 参数addr指针指向无法存取的内存空间。 ENOTSOCK 参数s为一文件描述词,非socket。 EOPNOTSUPP 指定的socket并非SOCK_STREAM。 EPERM 防火墙拒绝此连线。 ENOBUFS 系统的缓冲内存不足。 ENOMEM 核心内存不足。

Bind:

定义函数:

int bind(int sockfd,struct sockaddr * my_addr,int addrlen);

函数说明:

bind()用来设置给参数sockfd的socket一个名称。此名称由参数my_addr指向一sockaddr结构,对于不同的socket domain定义了一个通用的数据结构:

struct sockaddr {

unsigned short int sa_family; char sa_data; };

参数: sa_family 为调用socket()时的domain参数,即AF_xxxx值。 sa_data 最多使用14个字符长度。 此sockaddr结构会因使用不同 的socket domain而有不同结构定义。例如使用AF_INET domain, 其socketaddr结构定义便为: struct socketaddr_in {

unsigned short int sin_family; uint16_t sin_port; struct in_addr sin_addr; unsigned char sin_zero; };

16

西安工业大学毕业设计(论文) struct in_addr

{

uint32_t s_addr; };

参数: sin_family 即为sa_family sin_port 为使用的port编号 sin_addr.s_addr 为IP 地址 sin_zero 未使用。

addrlen为sockaddr的结构长度。

返回值: 成功则返回0,

失败返回-1,错误原因存于errno中。 错误代码:

EBADF 参数sockfd 非合法socket处理代码。 EACCESS 权限不足

ENOTSOCK 参数sockfd为一文件描述词,非socket。

Listen:

定义函数:

int listen(int s,int backlog);

函数说明:

listen()用来等待参数s 的socket连线。参数backlog指定同时能处理的最大连接要求,如果连接数目达此上限则client端将收到ECONNREFUSED的错误。 Listen()并未开始接收连线,只是设置socket为listen模式,真正接收client端连线的是accept()。通常listen()会在socket(),bind()之后调用,接着才调用accept()。

返回值: 成功则返回0,

失败返回-1,错误原因存于errno

附加说明: listen()只适用SOCK_STREAM或SOCK_SEQPACKET

的socket类型。如果socket为AF_INET则参数backlog 最大值可设至128。

错误代码:

EBADF 参数sockfd非合法socket处理代码 EACCESS 权限不足

EOPNOTSUPP 指定的socket并未支援listen模式。

17

西安工业大学毕业设计(论文)

Connect: 定义函数:

int connect (int sockfd,struct sockaddr * serv_addr,int addrlen);

函数说明:

connect()用来将参数sockfd 的socket 连至参数serv_addr 指定的网络地址。结构sockaddr请参考bind()。参数addrlen为sockaddr的结构长度。

返回值: 成功则返回0,

失败返回-1,错误原因存于errno中。

错误代码:

EBADF 参数sockfd 非合法socket处理代码

EFAULT 参数serv_addr指针指向无法存取的内存空间 ENOTSOCK 参数sockfd为一文件描述词,非socket。

EISCONN 参数sockfd的socket已是连线状态 ECONNREFUSED

连线要求被server端拒绝。 ETIMEDOUT 企图连线的操作超过限定时间仍未有响应。

ENETUNREACH 无法传送数据包至指定的主机。 EAFNOSUPPORT

sockaddr结构的sa_family不正确。 EALREADY 为不可阻断且先前的连线操作还未完成。

Htonl: 定义函数:

unsigned long int htonl(unsigned long int hostlong);

函数说明:

htonl()用来将参数指定的32位hostlong 转换成网络字符顺序。

返回值: 返回对应的网络字符顺序。

Htons: 定义函数:

unsigned short int htons(unsigned short int hostshort);

函数说明:

htons()用来将参数指定的16位hostshort转换成网络字符顺序。

18

西安工业大学毕业设计(论文) 返回值: 返回对应的网络字符顺序。

inet_addr: 定义函数:

unsigned long int inet_addr(const char *cp);

函数说明:

inet_addr()用来将参数cp所指的网络地址字符串转换成网络所使用的二进制数字。网络地址字符串是以数字和点组成的字符串,例如:“163.13.132.68”。

返回值: 成功则返回对应的网络二进制的数字, 失败返回-1。

inet_aton:

定义函数:

int inet_aton(const char * cp,struct in_addr *inp);

函数说明:

inet_aton()用来将参数cp所指的网络地址字符串转换成网络使用的二进制的数字,然后存于参数inp所指的in_addr结构中。 结构in_addr定义如下 struct in_addr { unsigned long int s_addr; };

返回值: 成功则返回非0值, 失败则返回0。

inet_ntoa:

定义函数:

char * inet_ntoa(struct in_addr in);

函数说明:

inet_ntoa()用来将参数in所指的网络二进制的数字转换成网络地址,然后将指向此网络地址字符串的指针返回。

返回值: 成功则返回字符串指针,

19

西安工业大学毕业设计(论文) 失败则返回NULL。

4.3 C/S构架

C/S(Client/Server)结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。这也就是目前应用系统的发展方向。

网络应用的最主要的模型是Client/Server模型,其实质是“请求驱动”。Client/Server模型最终可归结为一种“请求/应答”关系。一个请求总是首先被客户发出,然后服务器总是被动地接收请求,返回客户需要的结果。在客户发出一个请求之前,服务进程一直处于休眠状态。一个客户提出请求后,服务进程被“唤醒”并且为客户提供服务,对客户的请求作出所需要的应答。

本系统采用了Client/Server模式,同时也利用了Client/Server模型四个方面的特点:

(1)是Client/Server模型最重要的特点是非对等相互作用,即客户与服务器处于不平等的地位,服务器拥有客户所不具备的硬软件资源,客户和服务器分别是服务的请求者和提供者。实际上,网络中各个机器的资源是不平等的,网络的真正目的就是共享这些不均等的资源,Client/Server模型的非对等相互作用特点也正好体现和适应了客观现实中资源的不均等现象。

(2)关于技术性的,网络上不同主机进程间通信完全是异步的,通信时机具有随机性,所以必须有一种为通信双方的数据交换提供同步的机制,而Client/Server模型对此机制提供了极好的支持。由于上述原因,Client/Server模型由Sybase公司首先提出并在实际中应用后,迅速获得了广泛的支持,事实上己成为网络应用的标准模式。

(3)可以更方便、更清晰地分工应用软件的设计任务。

(4)可以降低对客户机的要求,使客户机只需处理人机界面为主的工作,适应日益扩展的应用需求。 4.3.1 C/S构架软件的优势与劣势

a.应用服务器运行数据负荷较轻

最简单的C/S体系结构的数据库应用由两部分组成,即客户应用程序和数据库服务器程序。二者可分别称为前台程序与后台程序。运行数据库服务器程序的机器,也称为应用服务器。一旦服务器程序被启动,就随时等待响应客户程序发来的请求;客户应用程序运行在用户自己的电脑上,对应于数据库服务器,可称

20

西安工业大学毕业设计(论文) 为客户电脑,当需要对数据库中的数据进行任何操作时,客户程序就自动地寻找服务器程序,并向其发出请求,服务器程序根据预定的规则作出应答,送回结果,应用服务器运行数据负荷较轻。 b.数据的储存管理功能较为透明

在数据库应用中,数据的储存管理功能,是由服务器程序和客户应用程序分别独立进行的,前台应用可以违反的规则,并且通常把那些不同的(不管是已知还是未知的)运行数据,在服务器程序中不集中实现,例如访问者的权限,编号可以重复、必须有客户才能建立定单这样的规则。所有这些,对于工作在前台程序上的最终用户,是“透明”的,他们无须过问(通常也无法干涉)背后的过程,就可以完成自己的一切工作。在客户服务器架构的应用中,前台程序不是非常“瘦小”,麻烦的事情都交给了服务器和网络。在C/S体系的下,数据库不能真正成为公共、专业化的仓库,它受到独立的专门管理。 c.C/S架构的劣势是高昂的维护成本且投资大

首先,采用C/S架构,要选择适当的数据库平台来实现数据库数据的真正“统一”,使分布于两地的数据同步完全交由数据库系统去管理,但逻辑上两地的操作者要直接访问同一个数据库才能有效实现,有这样一些问题,如果需要建立“实时”的数据同步,就必须在两地间建立实时的通讯连接,保持两地的数据库服务器在线运行,网络管理工作人员既要对服务器维护管理,又要对客户端维护和管理,这需要高昂的投资和复杂的技术支持,维护成本很高,维护任务量大。 其次,传统的C/S结构的软件需要针对不同的操作系统系统开发不同版本的软件,由于产品的更新换代十分快,代价高和低效率已经不适应工作需要。在JAVA这样的跨平台语言出现之后,B/S架构更是猛烈冲击C/S,并对其形成威胁和挑战。

d.客户端(Client)

客户端(Client)或称为用户端,是指与服务器相对应,为客户提供本地服务的程序。一般安装在普通的客户机上,需要与服务端互相配合运行。因特网发展以后,较常用的用户端包括了如万维网使用的网页浏览器,收寄电子邮件时的电子邮件客户端,以及即时通讯的客户端软件等。 e.服务器(Server)

服务器指一个管理资源并为用户提供服务的计算机软件,通常分为文件服务器、数据库服务器和应用程序服务器。运行以上软件的计算机或计算机系统也被称为服务器。相对于普通PC来说,服务器在稳定性、安全性、性能等方面都要求更高,因此CPU、芯片组、内存、磁盘系统、网络等硬件和普通PC有所不同。

21

5 软件开发 5 软件开发

5.1程序功能分析

本程序运用Winsock控件, 实现端到端文件的相互传送, 工作原理简单, 实现容易,可控性强。具有较高的实用价值。

基于局域网文件传输应该是一个可以提供文件自由共享和传输的程序,具有一个IP输入的界面,内置默认端口。有一个基本界面显示和提示,通过设计使其变得更加友好,并且在用户选择下载共享文件时与本地文件名相互比较,避免覆盖原有的文件,损失用户的重要信息。

对共享文件或文件夹进行管理,这涉及到了操作系统的方方面面,在强大的操作系统的支持下,程序的可靠性自然也就提高了。用户在禁止文件共享并不需要选择删除共享文件来实现,只需使用结束当前连接这样的功能即可,方便快捷,对用户提供更多方面,当然这只是涉及计算机网络理论知识中很小的知识,即关闭了传输层和应用层的链接。实现也十分容易。

5.2系统总体架构

实现对本地共享文件和设置的基本管理,包括: 添加:可以自由选择用户自己想作为共享的文件即可,共享的文件或文件夹的个数不一,依用户自己决定;

下载:客户端可以随时下载服务器上的共享文件;

显示:将服务器或者客户端的共享文件或文件夹显示出来; 设置:输入IP和端口后可以连接到指定服务器; 结束连接:通过结束连接关闭对文件的共享操作,此时任何其他计算机均不能访

问该计算机。

5.3设计流程图

点对点文件传输系统的实现应包含服务器模块、客户端模块等几个部分,

整个程序采用VC++6.0完成,通信部分采用WINSOCK,主要要能够实现文件的上传和下载,同时可以对已经上传的文件进行删除等操作。下图5-1是一个成功的文件传输过程的流程,但有可能出现接收方拒绝接收,或者在传输过程中,发送方取消发送或接收方取消接收的情况,在编程实现上必须考虑这些问题。

22

西安工业大学毕业设计(论文) 开始监听端口开始连接客户端连接服务器接收命令输入命令执行相应操作终止服务执行相应操作终止服务

图5-1 软件流程图

23

西安工业大学毕业设计(论文) 文件发送端文件接收端2:选择文件,启动发送线程1:启动监听进程5:发送文件属性【询问对方是否接受】4:接受连接请求,启动接收线程6:接收端选择保存路径,发送“同意文件接收”消息7:开始发送文件,显示发送进程8:开始接收文件,显示接收进程10:发送完结,结束发送进程9:接收完毕,结束接收进程

图5-2 文件传输过程的交互图

本软件采用面向连接的流式套接字,基于客户/服务器模型。为了使用方便,将客户和服务器设计在同一个用户界面中,根据用户需要将程序设置成客户端或者服务器端。程序工作时,首先由程序建立套接字连接,在连接的基础上,由重载的Socket事件通知函数启动相应的任务。为了提高程序的反应速度,程序的文件上传和文件下载任务由辅助线程启动。程序的调用时序图如下图5-2所示:

24

西安工业大学毕业设计(论文) 服务器

Socket () sockets 建立流式套接字 , 返回 客户机

Bind sockets () 将 与本地址相连 listen TCP () 通知 , 服务器准备好 Socket () 建立流式套接字 , 返回 sockets Accept S2 () 接收数据 , 得到一个 Connect () 将套接字与远程主机连接 等待客户数据 Recv send S2 () () 在 上读 , 写数据 / 服务请求 响应 Recv send () () 在套接字上读 , 写数 据 Closesocket () 2 关闭套接字 S Closesocket (), 关闭套接字 , 结束 TCP 对话 Closesocket (), 关闭最初的套接字

图5-2 系统调用时序图

5.4系统功能模块设计

5.4.1软件设计

软件采用面向对像的设计方法,考虑到对计算效率的要求,采用C++编程语

言,开发环境为Windows XP,编程工具为vc++6.0,采用C++标准库函数和MFC类库。

5.4.2服务器模块

(1)在初始化阶段调用WSAStartup()

此函数在应用程序中初始化Windows Sockets DLL ,只有此函数调用成功后,应用程序才可以再调用其他Windows Sockets DLL中的API函数。在程序中

25

西安工业大学毕业设计(论文) 调用该函数的形式如下:

WSAStartup((WORD)((1<<8|1),(LPWSADATA)&WSAData),其中(1<<8|1)表示我们用的是WinSocket1.1版本,WSAData用来存储系统传回的关于WinSocket的资料。

(2)建立Socket

初始化WinSock的动态连接库后,需要在服务器端建立一个监听的Socket,为此可以调用Socket()函数来建立这个监听的Socket,并定义此Socket所使用的通信协议。此函数调用成功返回Socket对象。失败则返回INVALID_SOCKET(调用WSAGetLastError()可得知原因,所有WinSocket 的函数都可以使用这个函数来获取失败的原因)。 SOCKET PASCAL FAR Socket( int af, int type, int protocol ); 参数:: af:目前只提供 PF_INET(AF_INET);

type: Socket 的类型 (SOCK_STREAM、SOCK_DGRAM); protocol: 通讯协定(如果使用者不指定则设为0);

如果要建立的是遵从TCP/IP协议的Socket,第二个参数type 应为SOCK_STREAM,如为UDP(数据报)的Socket,应为 SOCK_DGRAM。因此本设计中type应为SOCK_STREAM。

(3)绑定端口

接下来要为服务器端定义的这个监听的Socket指定一个地址及端口(Port),这样客户端才知道待会要连接哪一个地址的哪个端口,为此我们要调用bind()函数,该函数调用成功返回0,否则返回SOCKET_ERROR。

int PASCAL FAR bind( SOCKET s, const struct sockaddr FAR *name,int namelen );

参数: s:Socket对象名;

name: Socket的地址值,这个地址必须是执行这个程式所在机器的IP地址; namelen:name的长度;

如果使用者不在意地址或端口的值,那么可以设定地址为INADDR_ANY,及Port为0,Windows Sockets 会自动将其设定适当之地址及Port (1024 到 5000之间的值)。此后可以调用getsockname()函数来获知其被设定的值。

(4)监听

当服务器端的Socket对象绑定完成之后,服务器端必须建立一个监听的队列来接收客户端的连接请求。listen()函数使服务器端的Socket 进入监听状态,并设定可以建立的最大连接数(目前最大值限制为 5,最小值为1)。该函数调用成功返回0,否则返回SOCKET_ERROR。

int PASCAL FAR listen( SOCKET s, int backlog );

26

西安工业大学毕业设计(论文) 参数: s:需要建立监听的Socket;

backlog: 最大连接个数;

服务器端的Socket调用完listen()后,如果此时客户端调用connect()函数提出连接申请的话,Server 端必须再调用accept() 函数,这样服务器端和客户端才算正式完成通信程序的连接动作。为了知道什么时候客户端提出连接要求,从而服务器端的Socket在恰当的时候调用accept()函数完成连接的建立,我们就要使用WSAAsyncSelect()函数,让系统主动来通知我们有客户端提出连接请求了。该函数调用成功返回0,否则返回SOCKET_ERROR。

int PASCAL FAR WSAAsyncSelect( SOCKET s, HWND hWnd,unsigned int wMsg, longlEvent );

参数: s:Socket 对象;

hWnd : 接收消息的窗口句柄; wMsg: 传给窗口的消息;

lEvent: 被注册的网络事件,也即是应用程序向窗口发送消息的网路事 件,该值为下列值FD_READ、FD_WRITE、FD_OOB、

FD_ACCEPT、FD_CONNECT、FD_CLOSE的组合,

各个值的具体含意为

FD_READ: 希望在套接字S收到数据时收到消息;

FD_WRITE: 希望在套接字S上可以发送数据时收到消息; FD_ACCEPT: 希望在套接字S上收到连接请求时收到消息;

FD_CONNECT: 希望在套接字S上连接成功时收到消息; FD_CLOSE: 希望在套接字S上连接关闭时收到消息;

FD_OOB: 希望在套接字S上收到带外数据时收到消息。

具体应用时,wMsg应是在应用程序中定义的消息名称,而消息结构中的lParam则为以上各种网络事件名称。所以,可以在窗口处理自定义消息函数中使用以下结构来响应Socket的不同事件: switch(lParam) {case FD_READ; … break;

case FD_WRITE、 …

break;

… }

(5)服务器端接受客户端的连接请求

当Client提出连接请求时,Server 端hwnd视窗会收到Winsock Stack送来

27

西安工业大学毕业设计(论文) 我们自定义的一个消息,这时,我们可以分析lParam,然后调用相关的函数来处理此事件。为了使服务器端接受客户端的连接请求,就要使用accept() 函数,该函数新建一Socket与客户端的Socket相通,原先监听之Socket继续进入监听状态,等待他人的连接要求。该函数调用成功返回一个新产生的Socket对象,否则返回INVALID_SOCKET。

SOCKET PASCAL FAR accept( SCOKET s, struct sockaddr FAR *addr,int FAR *addrlen );

参数: s:Socket的识别码;

addr: 存放来连接的客户端的地址; addrlen: addr的长度。 (6)结束 Socket 连接

结束服务器和客户端的通信连接是很简单的,这一过程可以由服务器或客户机的任一端启动,只要调用closeSocket()就可以了,而要关闭Server端监听状态的Socket,同样也是利用此函数。另外,与程序启动时调用WSAStartup()函数相对应,程序结束前,需要调用 WSACleanup() 来通知Winsock Stack释放Socket所占用的资源。这两个函数都是调用成功返回0,否则返回SOCKET_ERROR。

int PASCAL FAR closeSocket( SOCKET s ); 参数: s:Socket 的识别码; int PASCAL FAR WSACleanup( void ); 参数: 无 5.4.3客户端模块

实际上客户端程序和服务器程序相似,同样要创建套接字并进行接收和发送数据,不同的是在进行数据传输之前,要进行和服务器端的连接。

(1)建立客户端的Socket

客户端应用程序首先也是调用WSAStartup() 函数来与Winsock的动态连接库建立关系,然后同样调用Socket() 来建立一个TCP(相同协定的 Sockets 才能相通,TCP 对 TCP)。与服务器端的Socket 不同的是,客户端的Socket 可以调用 bind() 函数,由自己来指定IP地址及port号码;但是也可以不调用 bind(),而由 Winsock来自动设定IP地址及port号码。

(2)提出连接申请

客户端的Socket使用connect()函数来提出与服务器端的Socket建立连接的申请,函数调用成功返回0,否则返回SOCKET_ERROR。

int PASCAL FAR connect( SOCKET s, const struct sockaddr FAR *name, int namelen );

28

西安工业大学毕业设计(论文) 参数: s:Socket 的识别码;

name: Socket想要连接的对方地址; namelen: name的长度;

(3)数据的传送

TCP Socket 的数据发送和接收是调用send()及recv() 两个函数来达成,send()函数参数及各参数含义如下:

int PASCAL FAR send( SOCKET s, const char FAR *buf,int len, int flags ); 参数: s:Socket 的识别码;

buf: 存放要传送的资料的暂存区; flags: 此函数被调用的方式。

而用来接受数据的recv()函数参数及各参数含义如下:

int PASCAL FAR recv( SOCKET s, char FAR *buf, int len, int flags ); 参数: s:Socket 的识别码;

buf: 存放接收到的资料的暂存区lenbuf:的长度; flags: 此函数被调用的方式。

界面显示

在设计时,充分考虑输入的容错性和用户界面的友好。当操作有误或者文件找不到时给予相应的提示并考虑用户是否进行正确的选择操作,对于程序窗口则采用MFC来完成,MFC是面向对象程序设计与Application framework的完美结合,他将传统的API进行了分类封装,并且创建了程序的一般框架。

本程序所实现的功能是实现文件的传输共享,可以实现局域网内客户端设置的IP地址和端口号来识别服务器,以供正确传送,IP和端口号可以自己设定,在进行共享传输文件或文件夹时需要进行连接操作,提供了此功能的设计,通过点击添加文件的按钮形式进行文件的共享,实现文件的传输,用户可以随时根据自己的时间安排来进行选择所需的共享文件,也是借此实现了文件的传输功能。

29

6 软件实现与测试 6 软件实现与测试

实验运行情况

双击服务器端运行,默认自动启动监听,情况如下图6-1: 软件包含两个按钮和一个信息显示框,单击添加文件按钮可以添加要共享给客户端的文件,退出按钮可以关闭套接字退出软件,信息显示框内分为三块,前面显示文件名,中间是文件的大小,最后显示文件路径。 下面具体测试一下文件的传输。

图6-1 服务器软件运行图示

点击添加文件按钮在弹出的对话框中选择具体的文件如图6-2

30

西安工业大学毕业设计(论文)

图6-2 添加文件

在同一局域网的另一台电脑上运行客户端,如下图6-3: 客户端软件同样有两个按钮和一个信息框,与服务器有区别的是多了一个ip地址输入框来输入想要连接的服务器的ip地址,在输入ip地址后单机连接就可以连上服务器。

图6-3 客户端运行图示

输入服务器端的IP进行连接,效果如图6-4:

31

西安工业大学毕业设计(论文)

图6-4 输入服务器ip地址

连接服务器后就可以看到服务器上共享的文件,选择需要的文件双击下载并选择本地保存位置,如图6-5:

图6-5 选择本地文件保存地址

选择完成就开始下载,可以看到速度和完成度,下载完成后的效果图6-6:

图6-6 文件下载完成

下载完成后,指定目录下就有了该文件了,双击文件打开说明文件是完整的。如图6-7:

32

西安工业大学毕业设计(论文)

图6-7 本地文件接收完毕

本测试使用了所编写的程序,简述了软件的操作过程,并给出了程序运行的结果。

33

7 总结 7 总结

本文较完整地讨论了网络和文件编程等相关技术的常用处理方法。针对网络文件传输问题,取得的研究成果如下(本文的主要工作如下):

1. 研究了局域网的工作模式,Windows下的网络编程。

2. 利用Winsocket的基本原理,实现了一种多线程模拟异步传输过程

综上所述,利用Winsock进行数据文件的传输,其特点是可控性强,实现灵活方便, 可根据需要将此功能扩展到广域网中, 使此方法的数据传输技术更加完善实用。今后的工作应该在广域网文件传输继续研究。

34

致 谢 致 谢

在论文完成之际,作者要特别感谢指导老师xx老师的热情关怀和悉心指导。在作者撰写论文的过程中,x老师倾注了大量的心血和汗水,无论是在论文的选题、构思和资料的收集方面,还是在论文的研究方法以及成文定稿方面,作者都得到了x老师悉心细致的教诲和无私的帮助,特别是她广博的学识、深厚的学术素养、严谨的治学精神和一丝不苟的工作作风使作者终生受益,在此表示真诚地感谢。在论文的写作过程中,也得到了许多同学的宝贵建议在此一并致以诚挚的谢意。感谢所有关心、支持、帮助过我的良师益友。

最后,向在百忙中抽出时间对本文进行评审并提出宝贵意见的各位专家表示衷心地感谢!

35

本文来源:https://www.bwwdw.com/article/agr7.html

Top