Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > VB. Ожидание события DataArrival


Автор: Gradik 21.11.2005, 16:25
Привет!

Возникла проблема с WinSock.

Код

while n < 100
        n = n + 1
        Winsock1(n).Connect "www.ya.ru", 80 
    
        While Not Winsock1(n).State = 7 
                   DoEvents '
        Wend '
        
        Winsock1(n).SendData "GET /?" & Parametrs & "HTTP/1.1" & vbCrLf & vbCrLf

 wend       


Как после каждого
Код

Winsock1(n).SendData "GET /?" & Parametrs & "HTTP/1.1" & vbCrLf & vbCrLf

дожидаться события Winsock1_DataArrival?

Автор: Akina 21.11.2005, 17:05
Цитата(Gradik @ 21.11.2005, 17:25)
Как [skipped] дожидаться события Winsock1_DataArrival?

Что значит - как? никак... когда оно возникнет, тогда возникнет... но чтобы оно возникло, ты ДОЛЖЕН выгрести все с помощью GetData (даже если получишь 0 байтов). Или не видать тебе DataArrival...

Автор: Gradik 21.11.2005, 17:45
Цитата(Akina @ 21.11.2005, 17:05)
Цитата(Gradik @ 21.11.2005, )
Как [skipped] дожидаться события Winsock1_DataArrival?

Что значит - как? никак... когда оно возникнет, тогда возникнет... но чтобы оно возникло, ты ДОЛЖЕН выгрести все с помощью GetData (даже если получишь 0 байтов). Или не видать тебе DataArrival...

В DataArrival с помощью GetData у меня все отлично получается!
Вы имеете ввиду, что никак нельзя дождаться DataArrival, не дожидаясь окончания цикла? while n < 100

Автор: Akina 21.11.2005, 19:44
Я вообще не понимаю в чем именно у Вас затык. Что, в каждом обороте цикла надо дожидаться прихода данных, что ли? ну так:

Код

While n < 100
  n = n + 1
  Winsock1(n).Connect "www.ya.ru", 80 
  While Not Winsock1(n).State = 7 
    DoEvents 
  Wend 
  Winsock1(n).SendData "GET /?" & Parametrs & "HTTP/1.1" & vbCrLf & vbCrLf

  While Flag
    DoEvents 
  Wend
  Flag=True

Wend

' ......

Public Flag As Boolean

Private Sub Winsock1_DataArrival
WinSock1.GetData
' .......
Flag=False
End Sub

но только учти что можешь ведь вообще не получить ни байта - мало ли, сервер лежит... заложи еще и тайм-аут...

PS. Кстати, регистрация в т.ч. позволяет исправлять свои сообщения вместо того чтобы плодить дубли. Вроде того что я удалил...

Автор: Gradik 22.11.2005, 09:30
Цитата(Akina @ 21.11.2005, 19:44)
Я вообще не понимаю в чем именно у Вас затык. Что, в каждом обороте цикла надо дожидаться прихода данных, что ли? ну так:

Код

While n < 100
  n = n + 1
  Winsock1(n).Connect "www.ya.ru", 80 
  While Not Winsock1(n).State = 7 
    DoEvents 
  Wend 
  Winsock1(n).SendData "GET /?" & Parametrs & "HTTP/1.1" & vbCrLf & vbCrLf

  While Flag
    DoEvents 
  Wend
  Flag=True

Wend

' ......

Public Flag As Boolean

Private Sub Winsock1_DataArrival
WinSock1.GetData
' .......
Flag=False
End Sub

но только учти что можешь ведь вообще не получить ни байта - мало ли, сервер лежит... заложи еще и тайм-аут...

PS. Кстати, регистрация в т.ч. позволяет исправлять свои сообщения вместо того чтобы плодить дубли. Вроде того что я удалил...

Спасибо!
Сейчас попробую.

Автор: Gradik 22.11.2005, 10:28
Привет!

1. А что делать, если я не дождалась за какое-то время ответа от сервера, можно ли просто сделать Winsock(index).Close, или есть другой способ?

2. Почему с сервера приходит очень много сообщений на один запрос (причем куча пустых), можно ли как-нибудь этого избежать? Можно ли использовать Winsock(index).Close после получения первого сообщения от сервера? А можно ли установить объем ответа, который я хочу от сервера получить?

Автор: Akina 22.11.2005, 10:36
Цитата(Gradik @ 22.11.2005, 11:28)
что делать, если я не дождалась за какое-то время ответа от сервера, можно ли просто сделать Winsock(index).Close

Цитата(Gradik @ 22.11.2005, 11:28)
Можно ли использовать Winsock(index).Close после получения первого сообщения от сервера?

конечно можно... IP-стек сам разберется и дропнет все что пришло на закрытый (т.е. несуществующий) сокет.

Цитата(Gradik @ 22.11.2005, 11:28)
Почему с сервера приходит очень много сообщений на один запрос (причем куча пустых), можно ли как-нибудь этого избежать?

Вопрос к серверу. А ты им не управляешь. Значит нельзя. Да и зачем?

Цитата(Gradik @ 22.11.2005, 11:28)
можно ли установить объем ответа, который я хочу от сервера получить?

Нет. Ты должен выбрать все что пришло. Но не обязан это все использовать - возьми да отрежь лишнее...

Автор: Gradik 22.11.2005, 10:48
Спасибо, очень благодарна!

Автор: Gradik 22.11.2005, 12:01
Почему-то никогда не выполняется Winsock1_DataArrival! Почему?
Делаю так:
Код

           Winsock1.SendData "GET /?" & Parametrs & "HTTP/1.1" & vbCrLf & vbCrLf
            
            n = Hour(Now) * 3600 + Minute(Now) * 60 + Second(Now)
        
            While (n + 30 > Hour(Now) * 3600 + Minute(Now) * 60 + Second(Now)) And _
                    flag = True
                    DoEvents
            Wend
            If flag = True Then
                Winsock1.Close
            End If
.................
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    flag = False
    Winsock1.GetData Data
........................

Что тут не так?

Автор: Akina 22.11.2005, 12:55
Ты посмотри попристальнее описание WinSock methods в MSDN... возьми примеры кода и доводи их под себя...

и потом - что за странная конструкция получилась?
Код

            While (n + 30 > Hour(Now) * 3600 + Minute(Now) * 60 + Second(Now)) And _
                    flag = True
                    DoEvents
            Wend
            If flag = True Then
                Winsock1.Close
            End If


сделай

Код

            CTimer = Timer + 30
            flag = True
            Do
                    DoEvents
            Loop While ((Timer < CTimer) And flag)
            If flag Then
                Winsock1.Close
            End If


К тому же я не понял - если что-то пришло, сокет останется незакрытым?

Автор: Gradik 22.11.2005, 13:17
Цитата(Akina @ 22.11.2005, 12:55)
Ты посмотри попристальнее описание WinSock methods в MSDN... возьми примеры кода и доводи их под себя...

и потом - что за странная конструкция получилась?
Код

            While (n + 30 > Hour(Now) * 3600 + Minute(Now) * 60 + Second(Now)) And _
                    flag = True
                    DoEvents
            Wend
            If flag = True Then
                Winsock1.Close
            End If


сделай

Код

            CTimer = Timer + 30
            flag = True
            Do
                    DoEvents
            Loop While ((Timer < CTimer) And flag)
            If flag Then
                Winsock1.Close
            End If


К тому же я не понял - если что-то пришло, сокет останется незакрытым?

Дело не в конструкции! flag всегда true!, я из цикла ожидания не попадаю в Winsock1_DataArrival. Почему?

Автор: Akina 22.11.2005, 15:33
Цитата(Gradik @ 22.11.2005, 14:17)
я из цикла ожидания не попадаю в Winsock1_DataArrival

а ты туда и не должна попадать из цикла - это же асинхронная процедура, и она сработает в одном из DoEvents

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)