Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> VB. Ожидание события DataArrival 
:(
    Опции темы
Gradik
Дата 21.11.2005, 16:25 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Привет!

Возникла проблема с 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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



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

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Gradik
Дата 21.11.2005, 17:45 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











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

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

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

Это сообщение отредактировал(а) cardinal - 21.11.2005, 18:57
  Вверх
Akina
Дата 21.11.2005, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



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

Код

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. Кстати, регистрация в т.ч. позволяет исправлять свои сообщения вместо того чтобы плодить дубли. Вроде того что я удалил...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Gradik
Дата 22.11.2005, 09:30 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 22.11.2005

Репутация: нет
Всего: нет



Привет!

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

2. Почему с сервера приходит очень много сообщений на один запрос (причем куча пустых), можно ли как-нибудь этого избежать? Можно ли использовать Winsock(index).Close после получения первого сообщения от сервера? А можно ли установить объем ответа, который я хочу от сервера получить?
PM MAIL   Вверх
Akina
Дата 22.11.2005, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(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)
можно ли установить объем ответа, который я хочу от сервера получить?

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Gradik
Дата 22.11.2005, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 22.11.2005

Репутация: нет
Всего: нет



Спасибо, очень благодарна!

PM MAIL   Вверх
Gradik
Дата 22.11.2005, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 22.11.2005

Репутация: нет
Всего: нет



Почему-то никогда не выполняется 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
........................

Что тут не так?
PM MAIL   Вверх
Akina
Дата 22.11.2005, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Ты посмотри попристальнее описание 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


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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Gradik
Дата 22.11.2005, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 22.11.2005

Репутация: нет
Всего: нет



Цитата(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. Почему?
PM MAIL   Вверх
Akina
Дата 22.11.2005, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



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

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.1075 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.