1 / 25
文档名称:

文件传输协议的C语言实现.doc

格式:doc   大小:414KB   页数:25页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

文件传输协议的C语言实现.doc

上传人:用户头像没有 2017/8/6 文件大小:414 KB

下载得到文件列表

文件传输协议的C语言实现.doc

文档介绍

文档介绍:第ChpNum章文件传输协议的C语言实现
1设计目的
本设计旨在利用Winsock (File Transfer Protocol,文件传输协议)的客户端和服务器端程序。通过完成此设计,了解Winsock API函数调用方法和一般网络应用程序的编程方法,理解FTP协议,掌握C语言设计FTP协议软件的基本技术,为将来开发其他通信协议软件打下坚实基础。
2 设计准备
(1)连入同一局域网的PC,每人一台。
(2)PC装有Windows操作系统、Visual C++ 。
3关键技术
文件传输协议介绍
FTP 是File Transfer Protocol(文件传输协议)的英文简称,上的控制文件的双向传输。在实现的层面上,FTP又可理解为一个可用于文件传输的客户机/服务器系统,该系统包括客户机端程序和服务器端程序,客户端和服务器端通信规则为FTP协议。用户通过客户机程序向服务器程序发出命令请求,服务器程序执行用户所发出的命令,并将执行的结果返回到客户机。比如说,用户发出一条命令,要求服务器向用户传送某一个文件的一份拷贝,服务器会响应这条命令,将指定文件送至用户的机器上。客户机程序接收到这个文件,将其存放在用户目录中。在通信协议的分层模型中,文件传输协议是在TCP(Transmission control Protocol,传输控制协议)之上的一个应用层协议,应用程序之间的通信需要用到传输层提供的字节流透明无误传输服务。Windows操作系统具有TCP/IP协议栈,应用程序可通过Winsock API函数的调用实现端到端透明数据链接的建立。
Winsock API介绍
因特网()最初是基于Unix的,而Sockets(套接字)是Unix第一个支持TCP/IP协议栈的网络API, BSD版Unix推出,常被称为Berkeley sockets(伯克利套接字)。Winsock(Windows Sockets API)是从Sockets移植过来的TCP/IP编程的低级Windows API。,从Windows 。
Winsock与windows操作系统的关系如图ChpNum-1所示。操作系统实现了TCP/IP协议栈,(包括传输层协议TCP及UDP;网络层协议IP、ICMP及IGMP;链路层协议ARP和RAR),该模块的相关功能以动态链接库的形式被应用程序调用。操作系统接受网卡驱动程序的注册,网卡驱动程序本质上是一套控制网卡硬件收发报文的函数,也是以动态链接库的形式被调用。物理通信介质是指网卡驱动芯片及其外围电路,完成链路层数据帧的封装/解封、发送/接收等功能。
图ChpNum1 Winsock与操作系统的关系
套接字可看作是不同主机间的进程进行双向通信的虚拟管道端点:网络中两台主机各自在自己机器上建立通信的端点--套接字,然后使用套接字进行数据通信。一个套接字包含五个基本元素:协议类型、本地IP地址、本地端口、远端IP地址和远端端口。在操作系统中,套接字是一种系统资源,应用程序使用时应向操作系统申请或注册,使用结束后应用程序应释放该该套接字。和其他系统资源一样,操作系统为套接字分配一个唯一的ID(在Windows中被称作句柄)。
根据网络通信的特征,套接字分为三类:流套接字(SOCK_STREAM)、数据报套接字(SOCK_DGRAM)和原始套接字(SOCK_RAW)。流套接字是面向连接的,它提供双向的、有序的、无差错、无重复并且无记录边界的数据流服务,适用于处理大量数据,提供可靠的服务。数据报套接字是无连接的,它支持双向的数据传输,具有开销小、数据传输效率高的特点,但不保证数据传输的可靠性、有序性和无重复性,适合少量数据传输、以及时间敏感的音/视频等多媒体数据传输。原始套接字(SOCK_RAW)可以用作对底层协议(如IP或ICM)的直接访问。
Winsock网络应用程序利用API 函数(ept、send、recv等函数)进行I/O操作时有阻塞和非阻塞两种模式。若要获取的资源还没有到达(如:接收缓冲区中没有数据提供给recv函数),在阻塞模式下,执行I/O操作的Winsock函数在I/O操作完成前
会一直等待下去,不会立即返回;而在非阻塞模式下,该函数不管I/O操作有没有完成都会立即返回,若未完成一般会返回错误码WSAWOULDBLOCK,意味着必须重新进行尝试。阻塞模式与非阻塞模式比较,从编程角度来说,前者更便于使用,但从程序运行的效率来说,由于阻塞调用后会使得所在的线程(如果是主线程那么就是整个程序)等待在该I/O操作上,因此后者效率更高。默认情况下,这