Странные ответы FTP сервера...

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Странные ответы FTP сервера...

Сообщение SergeySV » 20.08.2003 (Ср) 15:32

Только не бейте меня ногами,... опять про этот Winsock. Знаю, его работу же тысячу раз обсуждали на форуме и в инете полно инфы, однако про мой маленький глюк я ничего не нашел и потому спешу к Вам за советом, потому как мои мозги потихоньку начинают плавиться..

Проблема вот в чем: устанавливается связь с 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
[/code]
Главное двигаться не быстрее, чем думает твоя голова.

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Re: Странные ответы FTP сервера...

Сообщение SergeySV » 21.08.2003 (Чт) 11:28

Ну что, никто ничего не подскажет?

Может паузу какую-нибудь другую поставить, кто что предложит?, я делаю через
Do
DoEvents
Loop While полж. событие

пробовал еще Sleep, но тоже не вариант... :-(
Главное двигаться не быстрее, чем думает твоя голова.

Tauron
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 187
Зарегистрирован: 14.07.2002 (Вс) 17:43
Откуда: Kazakhstan

Сообщение Tauron » 21.08.2003 (Чт) 18:25

У компонента Winsock есть событие DataArrival и не нужно никаких страшных функций.
Трезвая голова, холодный ум и ледяное сердце.

Георгий
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 126
Зарегистрирован: 08.08.2003 (Пт) 15:08
Откуда: Россия

Сообщение Георгий » 22.08.2003 (Пт) 15:33

На правах предположения:
Ты получил код и пытаешь отправить "USER", а сервант еще тебе не передал всю строку. И не ждет от тебя "USER"
Origin - это что?


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot, Yandex-бот и гости: 4

    TopList