Как определить, что пользователь дозванивается?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
gvozd1989
Новичок
Новичок
 
Сообщения: 38
Зарегистрирован: 13.01.2005 (Чт) 9:16
Откуда: Украина

Как определить, что пользователь дозванивается?

Сообщение gvozd1989 » 01.11.2005 (Вт) 9:11

Можно ли как-то определить, что пользователь подключается к Инету, то есть начал дозваниваться?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.11.2005 (Вт) 12:07

А как отличить дозвон к интернету от дозвона к соседу?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 01.11.2005 (Вт) 13:43

Подключить библиотеку rtfm32.tlb (ее легко найти на сайте Microsoft), заюзать класс Rtfm32.Sound:

Код: Выделить всё
Dim objR As Rtfm32.Sound

<...>

Private Sub Form_Load()
    Set objR = New Rtfm32.Sound
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Set objR = Nothing
End Sub

<...>
'таймер tmrMain надо поставить на форму
Private Sub tmrMain_Timer()
    If objR.Compare(objR.GetWaveData, _
    objR.SoundLib.Extract(rt32_ModemSound)) = 0 Then
        MsgBox "Дозвон!", vbInformation
    End If
End Sub


А если серьезно - функция RasEnumConnections позволяет получить информацию обо всех активных соединениях (т.е. узнать, что пользователь уже подключился).
Моду создают модоки, а распространяют модозвоны.

Info_m.be_free
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 154
Зарегистрирован: 27.02.2003 (Чт) 21:38
Откуда: Ирпень

Сообщение Info_m.be_free » 01.11.2005 (Вт) 14:54

Читаем доку по модему - смотрим команду дозвона (АТ& ) отслеживаем...

Ем вилкой...

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 01.11.2005 (Вт) 14:58

Можно, конечно, "ловить" команды с COM-порта (MSComm или API). Непонятно, правда, что делать, если модем стоит на USB. К тому же, ему нужно отследить подключение именно к Интернету. Ограниченный выход: получить через RAS все доступные номера для дозвона и сверять их с "отловленными". Совпадения есть - значит, юзер стучится в Интернет...
Моду создают модоки, а распространяют модозвоны.

Info_m.be_free
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 154
Зарегистрирован: 27.02.2003 (Чт) 21:38
Откуда: Ирпень

Сообщение Info_m.be_free » 01.11.2005 (Вт) 15:40

Ну как отличить во время дозвона GSerg уже ответил... кто знает будет по этому номеру пул или это тел.. товарища который извратным способом в инет выводит... разве что вести статистику... а примеров отслеживания подключения к инету достаточно и трошки... тоись
1- можем определить факт дозвона
2 - после соединения проверить - инет это или нет...
3- интересно зачем такой гимммор

Ем вилкой...

gvozd1989
Новичок
Новичок
 
Сообщения: 38
Зарегистрирован: 13.01.2005 (Чт) 9:16
Откуда: Украина

Сообщение gvozd1989 » 01.11.2005 (Вт) 16:11

Мне нужно определить, что юзер пытается соединиться по одному из соединений. Чисто работать с модем - не выход, юзер может выходить через локалку. Вообще мне нужно успеть запустить фаерволл до осуществления фактического коннекта. Во как. :?
Изображение

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 01.11.2005 (Вт) 18:17

RASAPI, перебираешь и смотришь их состояние...
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Mleha
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 146
Зарегистрирован: 06.10.2004 (Ср) 7:49
Откуда: Ангарск

Сообщение Mleha » 01.11.2005 (Вт) 18:34

hCORe писал(а):Можно, конечно, "ловить" команды с COM-порта (MSComm или API).

А модем во время дозвона уже используется виндой, так что ничего не отловишь :lol:
Если только писать прогу для дозвона.

gvozd1989
Новичок
Новичок
 
Сообщения: 38
Зарегистрирован: 13.01.2005 (Чт) 9:16
Откуда: Украина

Сообщение gvozd1989 » 02.11.2005 (Ср) 18:17

Sebas
Поподробнее, плз. Пробовал RasEnumConnections - возвращает всегда 0, а в RasGetConnectionStatistics не нашел инфы о соединении...
Изображение

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 02.11.2005 (Ср) 21:10

1) RasEnumConnections и должен возвращать 0, если все в порядке.

2) Решение найдено! RasEnumConnections пробегаемся по всем соединениям. При помощи RasGetConnectStatus узнаем, есть коннект или нет (подробнее см. MSDN)

Вот, кстати, и пример подоспел:
Код: Выделить всё
Option Explicit

'на форму положить:
'Timer (таймер) с именем "tmrTimer";
'Label (надпись) с именем "lblInfo";

Private Declare Function RasEnumConnections Lib "RasApi32.DLL" _
    Alias "RasEnumConnectionsA" (lpRasCon As Any, lpcb As _
    Long, lpcConnections As Long) As Long

Private Declare Function RasGetConnectStatus Lib "RasApi32.DLL" _
    Alias "RasGetConnectStatusA" (ByVal hRasCon As Long, _
    lpStatus As Any) As Long

Const RAS_MaxEntryName = 256
Const RAS_MaxDeviceType = 16
Const RAS_MaxDeviceName = 32

Private Type RASType
  dwSize As Long
  hRasCon As Long
  szEntryName(RAS_MaxEntryName) As Byte
  szDeviceType(RAS_MaxDeviceType) As Byte
  szDeviceName(RAS_MaxDeviceName) As Byte
End Type

Private Type RASStatusType
  dwSize As Long
  RasConnState As Long
  dwError As Long
  szDeviceType(RAS_MaxDeviceType) As Byte
  szDeviceName(RAS_MaxDeviceName) As Byte
End Type

Private Sub Form_Load()
  tmrMain.Interval = 10
End Sub

Private Function ConnectStatus() As Boolean
  Dim RAS(255) As RASType, RASStatus As RASStatusType
  Dim lg, lpconnection, Result

  RAS(0).dwSize = 412
  lg = 256 * RAS(0).dwSize
  Result = RasEnumConnections(RAS(0), lg, lpconnection)

  If lpconnection = 0 Then
    ConnectStatus = False
    lblInfo.Caption = "Offline"
  Else
    RASStatus.dwSize = 160
    Result = RasGetConnectStatus(RAS(0).hRasCon, RASStatus)
    If RASStatus.RasConnState = &H2000& Then
      ConnectStatus = True
      lblInfo.Caption = "Online"
    Else
      ConnectStatus = False
      lblInfo.Caption = "Unknown Status"
    End If
  End If
End Function

Private Sub tmrMain_Timer()
  ConnectStatus
End Sub


(слизано отсюда)

3) Опрос портов и самоличный дозвон - полушутка. Никто в здравом уме такими вещами заниматься не будет :)
Последний раз редактировалось hCORe 02.11.2005 (Ср) 21:19, всего редактировалось 1 раз.
Моду создают модоки, а распространяют модозвоны.

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 02.11.2005 (Ср) 21:17

Но - если юзер собирается в локалку - RASAPI мало чем поможет... В принципе, можно получать информацию о сетевых адаптерах через WMI. Но это лучше расскажет Sebas, WMI - его кредо :)
Моду создают модоки, а распространяют модозвоны.


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17

    TopList