| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2236 人关注过本帖
标题:如何打开ftp的被动模式
只看楼主 加入收藏
leon2
Rank: 3Rank: 3
等 级:新手上路
威 望:7
帖 子:731
专家分:0
注 册:2005-3-18
收藏
得分:0 
Inet 控件应该不用设置被动模式也可以传输文件的。

我那个是 Winsock,你也知道了。
2006-08-04 00:44
syh878
Rank: 1
等 级:新手上路
威 望:2
帖 子:461
专家分:0
注 册:2005-9-2
收藏
得分:0 

现在就是别人用我的东西,说他那边有防火墙传东西传不过来,必须要被动模式才能传东西过来.他不愿把防火墙关掉(求人办事就是恶心!!!)哎,现在我想用winsock来重新写,可是网络的东西我接触的不多,所以想请大哥把你写的东西借我看看,跪求啊!!!!


2006-08-04 08:49
leon2
Rank: 3Rank: 3
等 级:新手上路
威 望:7
帖 子:731
专家分:0
注 册:2005-3-18
收藏
得分:0 

我也免得让你恶心了,也不知道是谁大谁小。。。
我就把整个 Winsock 接受信息的事件发上吧

主要就是 select case 那里是判断得到的消息的号码(类型)
发送 "PASV"[换行符] 后从服务器返回的消息是
227 Entering Passive Mode (xxx,xxx,xxx,xxx,xxx)
去 227 的 case 看,就是得到数据端口的过程:
其他的号码看你的需要定,有一些是登录服务器用的,加了注释你可以看一下

ps: 你了不了解 ftp 的命令?网上有当。

Private Sub sckCommand_DataArrival(ByVal bytesTotal As Long)

Dim strData As String, iFTPCode As Integer
Dim strMsgs() As String, iMsg As Integer
Dim i As Integer, i2 As Integer, l As Long
Dim strTemp As String, strTemp2 As String

sckCommand.GetData strData, vbString
strLastMsg = strData
strMsgs = Split(strData, vbNewLine)

For iMsg = 0 To UBound(strMsgs) - 1

iFTPCode = 0 '<--必要语句!

If Left(strMsgs(iMsg), 4) Like "??? " Then
iFTPCode = Trim(Left(strMsgs(iMsg), 3))
End If
ShowMessage strMsgs(iMsg), mcRecvMsg

Select Case iFTPCode
Case 220 '登录

fsFTPState = fsConnected
SetStatusText "正在登录......"

SendCommand "USER " & SiteConn.strUsername

Case 331 '密码

SendCommand "PASS " & SiteConn.strPassword

Case 230 '登录成功

fsFTPState = fsLogined
SetStatusText "登录成功。"

If SiteConn.strRemotePath <> "/" Then
ChangeRWD SiteConn.strRemotePath
Else
PrintDir
End If

Case 530 '登录失败

fsFTPState = fsIdle
ShowMessage "登录失败!", msErrMsg
SetStatusText "登录失败。"
MsgBox "对不起,登录失败,请检查用户名或密码是否正确。", vbExclamation, "错误"

Disconnect

Case 257 '返回目录名称或创建目录成功

If fsFTPState = fsPrintDir Then

i = InStr(strMsgs(iMsg), """") + 1
i2 = InStr(i, strMsgs(iMsg), """")
strTemp = Mid(strMsgs(iMsg), i, i2 - i)
strRemotePath = strTemp
txtRemote.Text = strTemp

ElseIf fsFTPState = fsMakeDir Then
ShowMessage "创建目录成功!", msStatMsg
End If

ListDir 0 '刷新目录

Case 200 '改变传输类型或文件操作完成

If fsFTPState = fsChangeDir Then
PrintDir
Else
GoPASV
End If

Case 227 '成功进入 PASV 模式

' SEE HERE-------------------------------------------------------------------------

strMsgs(iMsg) = Replace(strMsgs(iMsg), ",", ".")
i = InStr(strMsgs(iMsg), sckCommand.RemoteHostIP) + Len(sckCommand.RemoteHostIP) + 1
i2 = InStr(i, strMsgs(iMsg), ".")
strTemp = Mid(strMsgs(iMsg), i, i2 - i)
i = i2 + 1
i2 = InStr(i, strMsgs(iMsg), ")")
strTemp2 = Mid(strMsgs(iMsg), i, i2 - i)
l = Val(strTemp) * 256 + Val(strTemp2)

ShowMessage "正在连接数据端口......", msStatMsg
SetStatusText "正在连接数据端口......"

sckData.Close
sckData.Connect SiteConn.strSiteIP, l

Case 150 '开始数据传输

If sckData.Tag = "Up" Then
UploadData
End If

Case 226 '传输完成

fsFTPState = fsIdle
ShowMessage "传输完成。", msStatMsg
SetStatusText "传输完成。"

Select Case sckData.Tag
Case "Up"
If iQueueFiles = -1 Then
ListDir 0
Else
GoQueueFile
End If
End Select

Case 250 '文件操作完成

Select Case fsFTPState
Case fsChangeDir
PrintDir
Case fsDelete
ShowMessage "删除文件完成。", msStatMsg

If iRDelItemsNum = 0 Or (iRDelCur = iRDelItemsNum) Then
Erase iRDelItems()
iRDelItemsNum = -1
iRDelCur = -1
ListDir 0
Else
iRDelCur = iRDelCur + 1
If FTPFiles(iRDelItems(iRDelCur)).bFolder Then
RemoveRDir iRDelItems(iRDelCur), False
Else
DeleteRFile iRDelItems(iRDelCur), False
End If
End If

Case fsRename
ShowMessage "重命名/移动文件完成。", msStatMsg
sckData.Tag = "List"
If Not SetType(0) Then GoPASV
End Select

Case 350 '重命名为新文件名

SendCommand "RNTO " & strRRenTo

Case 550 '未执行请求操作

Select Case fsFTPState
Case fsChangeDir
ShowMessage "无法跳转目录!", msErrMsg
Case fsUpload
ShowMessage "无法上传该文件: " & QueueFiles(iQueueTop).strFilename & "!", msErrMsg
picProgress.Visible = False
Close #1
Case fsDownload
ShowMessage "无法下载该文件: " & QueueFiles(iQueueTop).strFilename & "!", msErrMsg
picProgress.Visible = False
Close #1
Case fsMakeDir
ShowMessage "创建目录失败!可能是目录名已存在,也可能是您没有在此路径下创建目录的权限。", msErrMsg
Case fsRename
ShowMessage "重命名或移动文件/目录失败!", msErrMsg
End Select

If fsFTPState = fsChangeDir Then
txtRemote.Text = strRemotePath
ListDir 0
Else
ChangeRWD strRemotePath
End If

Case 553 '未执行请求命令

ShowMessage "请求的命令失败!", msErrMsg
ChangeRWD strRemotePath

Case 426 '中止传输

If fsFTPState = fsUpload Or fsFTPState = fsDownload Then
ShowMessage "中止传输,传输文件失败!", msErrMsg
lSent = 0
EndOfTransfer IIf(fsFTPState = fsUpload, 0, 1)
ListDir 0
End If

Case 221, 421, 500 '断开连接
Disconnect
End Select

Next

End Sub

再有不懂再问

[此贴子已经被作者于2006-8-4 12:35:14编辑过]

2006-08-04 12:34
金灿
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2006-8-4
收藏
得分:0 

2006-08-04 19:19
syh878
Rank: 1
等 级:新手上路
威 望:2
帖 子:461
专家分:0
注 册:2005-9-2
收藏
得分:0 

先谢谢了...呵呵


2006-08-04 20:14
syh878
Rank: 1
等 级:新手上路
威 望:2
帖 子:461
专家分:0
注 册:2005-9-2
收藏
得分:0 
leon2,如果不方便把你的那个程序的源码借我看看,请你给我一个简单的用winsock实现上传下载的源码啊???谢谢了!

2006-08-07 14:01
syh878
Rank: 1
等 级:新手上路
威 望:2
帖 子:461
专家分:0
注 册:2005-9-2
收藏
得分:0 

up,好多自定义的过程,偶不知道是干什么的,我要的代码主要是登陆、下载,和上传的代码,其他的我自己写就行了。(第一次用winsock编程还望多帮忙)


2006-08-07 16:00
leon2
Rank: 3Rank: 3
等 级:新手上路
威 望:7
帖 子:731
专家分:0
注 册:2005-3-18
收藏
得分:0 
[UserName=syh878]
这是两个模块,一个是 ftp 一个是 main。
VEp6P5Zw.rar (7.45 KB) 如何打开ftp的被动模式



先开 ftp 那个,里面有个 connectServer 过程,那是连接服务器的(有很多代码你可能用不到)。
然后对 ftp 服务器的消息作出反应的代码是上次我给你的那一段长长的,每个数字号旁边都有说明意思,可以照着看。

ftp 模块里面的 uploadfile downloadfile 是用来下载的。上传下载我用的是另一个用来传输数据的 winsock(我有两个 winsock,一个是 sckCommand 用来传输ftp指令的,一个是 sckData 用来传输文件数据的。
sckData_DataArrival 代码:

Dim byteData() As Byte, sPercent As Single

sckData.GetData byteData, vbByte + vbArray
Put #1, , byteData

SetStatusText "下载文件......"
' 下面这些是判断是否已经传输了全部文件数据,Queue 是文件队列,我学其他著名 ftp 软件的 :)
' QueueFiles(iQueueTop).strSize 是文件总大小

If LOF(1) >= QueueFiles(iQueueTop).strSize Then
EndOfTransfer 1
If iQueueFiles > -1 Then
GoQueueFile
End If
End If

应该差不多了吧。不知道你要不要列表操作。。。有问题再说吧
[/UserName]
2006-08-07 16:43
pulf
Rank: 1
等 级:新手上路
帖 子:78
专家分:0
注 册:2006-7-31
收藏
得分:0 
帮你顶一下吧。

2006-08-07 20:58
syh878
Rank: 1
等 级:新手上路
威 望:2
帖 子:461
专家分:0
注 册:2005-9-2
收藏
得分:0 
谢谢啊!!!

2006-08-08 13:04
快速回复:如何打开ftp的被动模式
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018168 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved