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

2019-04-22 23:22

西安工业大学毕业设计(论文) 较常使用的是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


基于局域网的文件传输系统的设计与实现 论文定稿(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:奥鹏南开16春学期《职场心理》在线作业

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: