socket编程 上传下载文件

想从某云上通过ftp上传一些东西,可却发现该云上没有ftp客户端,于是就搜索了下ftp协议,简单地了解后就开始准备写一个ftp上传程序,本以为很简单的东西那成想还真遇到了不少困难,现将折腾的结果贡上

先来看ftp协议的一些指令

这里我要上传,需要的只有一个指令,那就是stor指令,当然在此之前我们需要先登陆下ftp服务器,这个不用说,然后说下我遇到的困难

在看到这些指令后本以为很简单,于是乎就用telnet去测试了,可结果发现list指令却总是返回425 No data connection,费了好大功夫也不知道是什么原因,抓下包看看吧

原来list之前还有个port指令,这后面的不是我的ip地址吗,再后来的是什么东西?
于是再去搜索ftp协议port指令,一看才明白,原来ftp协议有port(主动)模式和pasv(被动)模式
两者区别在于前者是ftp服务端到客户端,后者是客户端到服务端,糊涂了?

PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据 时,客户端在命令链路上用PORT命令告诉服务器:“我打开了XXXX端口,你过来连接我”。于是服务器从20端口向客户端的XXXX端口发送连接请求, 建立一条数据链路来传送数据。

PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据 时,服务器在命令链路上用PASV命令告诉客户端:“我打开了XXXX端口,你过来连接我”。于是客户端向服务器的XXXX端口发送连接请求,建立一条数 据链路来传送数据。

从上面可以看出,两种方式的命令链路连接方法是一样的,而数据链路的建立方法就完全不同。而FTP的复杂性就在于此。

看来我连接的这个ftp服务器是port模式的,所以就按port模式来做了

我们可以看到port指令后面的参数,port后面有6个参数,前四个是ip地址,后两个是用来确定端口号的,每个数字之间使用,分隔,即使是ip地址也是这样(为什么会这样- -),比较我们的ip地址是127.0.0.1,作为port参数就应该是127,0,0,1

后面的两个数字是这样的,拿前一个数字乘以256再加上后面一数字得到的将是端口号,比如上面的177,202就是

177*256=45312

45312+202=45514

看看后面返回的数据,正好是45514,所以也就是说我们在绑定了一个临时端口号后对256求余,余数便是第二个参数,再将这个端口号除以256取整,便是前面的一个数字,比如40857端口

40857%256=153

40857/256取整数部分=159

看看上面,刚好有个40857端口

好了,这个困难已经迈过来了,下面就是要写代码了

上面这只是一个简单的测试,而且我还简单地对输入的指令进行匹配,由于只是上传下载和查看当前目录,所以只匹配了list、stor、retr三个指令

mysock的代码可从这里下载到 https://github.com/briskgreen/mysock

下面是我做测试的截图

socket编程 上传下载文件 - 枯龙吟 - 枯龙吟

登陆到ftp服务器

socket编程 上传下载文件 - 枯龙吟 - 枯龙吟

查看下当前目录里面的文件内容

socket编程 上传下载文件 - 枯龙吟 - 枯龙吟

看t.c上传成功了

 

–阅读次数(43)

发表评论

电子邮件地址不会被公开。

*