二.基础
先一起来把理查德爷爷的东西简单地温习一遍:FTP(File Transfer Protocol,文件传输协议)是Internet网络上使用最频繁的协议之一(早期非常使用频繁,后来被http抢去了头座)。FTP的命令数量非常之多,功能也极为强大,协议底层也很复杂,再加上FTP使用的是稳定的TCP协议(TFTP使用的是不稳定的UDP),有很高的传输质量,所以FTP也注定了是大文件传输、大吞吐量的数据交换的首选途径。
FTP一般是以客户机/服务器模式存在的,在数据连接和命令连接的基础上传输文件数据。我们今天要写的就是一个基于FTP协议的FTP服务器。
本文中的FTP服务器基本实现了文件的上传/下载,支持断点续传,支持PORT和PASV模式,并且支持相应的文件操作和目录操作。
太多的原理性的东西我不多说了,毕竟是程序性的文章,想详细知道的,可以去看《TCP/IP详解》的FTP相关章节。
注:限于篇幅关系,本文中的代码我就不加详细注释了,代码部分均不完整,变量或函数可能非法或没有申明。杂志光盘上附有完整源代码,建议对照阅读,编程基础还是要的,代码完全用C和SOCKETAPI写。
三.建立环境
我们要构建的是一个FTP服务器,众所周知,FTP服务器工作的时候占用的知名端口21(当然,你也可以不要这个端口):
sockAddr.sin_family=AF_INET;//internet模式
sockAddr.sin_port=htons(21);//端口21
sockAddr.sin_addr.S_un.S_addr=INADDR_ANY;//接受所有的地址
为了不占用21端口,为后续的用户做准备,我们用建立线程的方式,对每一个申请连接的FTP客户做服务。为了实现多用户,用了固定的几个(64)全局结构变量。也可以用数据结构上的链表的方式动态地加入用户结构:
beginSock=accept(FTPserver, (struct sockaddr *)&client, &clicnttemp);
//等待用户连接
if (beginSock==INVALID_SOCKET) return 1;
DWORD funid;
if(CreateThread(NULL, 0, ThreadFunctheFtp,(LPVOID)beginSock, 0, &funid)==0)
//开始建立ftp用户线程
建立了这个环境了后,等待客户端的到来,接下来的就是FTP的协议了。
[1] [2] [3] 下一页