Проблема вот в чем: устанавливается связь с FTP-сервером через Winsock:
- Код: Выделить всё
WinsockCom.Close
WinsockCom.RemotePort = 21
WinsockCom.RemoteHost = FromHost
WinsockCom.Connect
Ждем ответа и получаем его (полный ОК):
- Код: Выделить всё
sData = WaitDataFTP(WinsockCom)
If sData <> "220" Then GoTo Er_
Отправляем команду USER и получаем шишь:
- Код: Выделить всё
sSendData = "USER " & sUser & vbCrLf
WinsockCom.SendData sSendData
sData = WaitDataFTP(WinsockCom)
Переменная sData пустая (В конце приводится код функции WaitDataFTP). При этом если команду WinsockCom.SendData "USER имя" & vbCrLf повесить на отдельную кнопку, и нажать ее потом, когда получен ответ от FTP об успешном конекте, получим нормальный ответ (Код - 331).
Т.е., попробую конкретизировать:
1. Если после получения кода 220 (успешный конект) от FTP ниже написать команду WinsockCom.SendData sSendData, то ответа от FTP не приходит вообще. Если между получением ответа 220 и командой WinsockCom.SendData sSendData поставить паузу сек. на 5:
- Код: Выделить всё
lTime = timeGetTime
Do
DoEvents
Loop Until timeGetTime - lTime > 3000
- все равно не помогает. FTP молчит.
2. Дальше, не закрывая это соединение нажимаем на другую кнопку с таким кодом:
- Код: Выделить всё
WinsockCom.SendData "USER имя" & vbCrLf
- (получается что это мы уже второй раз подряд посылаем на FTP команду USER ) - получаем интересный ответ - 530 Not logged in.
Опять нажимаем на эту кнопку и наконец получаем ответ - 331 User name okay.
3. При этом, если операцию conect повесить на одну кнопку, а посылку команды User на другую и последовательно их нажимать, то сразу получим ответ - 331 User name okay.
Не могу понять в чем здесь дело. Дело вроде в паузах, wisock не успевает принимать и отправлять команды, но я же ставлю различные паузы и нифига не помогает, а когда делишь на две операции, то все путем....бред какой-то
- Код: Выделить всё
Public Function WaitDataFTP(ByRef wnsock As Object) As String
Dim sData As String
Dim sKod As String
Dim lTime As Long
Const clTimeOut As Long = 5000
On Error GoTo Err_
' проверим, готов ли Winsock к приему данных
If wnsock.State <> 7 Then
' winsock не готов к приему данных.
If wnsock.State = 6 Then
' winsock в процессе подключения, ждем пока
lTime = timeGetTime
Do
DoEvents
If (timeGetTime - lTime > clTimeOut) Then GoTo Err_
Loop Until wnsock.State = 7
Else
GoTo Err_
End If
End If
' ожидаем получение данных
lTime = timeGetTime
Do
DoEvents
wnsock.GetData sData, vbString
sKod = Left$(sData, 3)
If (timeGetTime - lTime > clTimeOut) Then Exit Do
Loop Until Len(sKod) = 3
WaitDataFTP = sKod
Ex_:
Exit Function
Err_:
WaitDataFTP = ""
Resume Ex_
End Function