Avatar billede brian Nybegynder
28. oktober 1999 - 16:03 Der er 5 kommentarer og
2 løsninger

Forbindelse oprettet.

Jeg sidder og er ved at lave et program der skal overvåge mit internetforbrug (som min kone syntes er alt for stort), og er stødt ind i et problem :
Jeg overvåger forbindelsen og mit program starter når jeg trykker på "etabler forbindelse", men hvordan kan jeg se hvornår forbindelsen er oprettet.

Det gør ikke så meget med ISDN forbindelser, de er jo hurtigt logget på, men analoge modems tager jo let 20-30 sekunder før forbindelsen er endeligt oprettet.

Jeg bruger :
Private Declare Function RasEnumConnections Lib "RasApi32.dll" Alias "RasEnumConnectionsA" (lpRasConn As Any, lpcb As Long, lpcConnections As Long) As LongPublic Const RAS_MAXENTRYNAME As Integer = 256
Public Const RAS_MAXDEVICETYPE As Integer = 16
Public Const RAS_MAXDEVICENAME As Integer = 128
Public Const RAS_RASCONNSIZE As Integer = 412
Public Const ERROR_SUCCESS = 0

Public Type RasConn
    dwSize As Long
    hRasConn As Long
    szEntryName(RAS_MAXENTRYNAME) As Byte
    szDeviceType(RAS_MAXDEVICETYPE) As Byte
    szDeviceName(RAS_MAXDEVICENAME) As Byte
End Type

Function CheckConnections() As Integer
    Static ConnCount As Integer
    Dim RasConn(255) As RasConn
    Dim structSize As Long
    Dim ConnectionsCount As Long
    Dim ret As Long

RasConn(0).dwSize = RAS_RASCONNSIZE
    structSize = RAS_MAXENTRYNAME * RasConn(0).dwSize
    ret = RasEnumConnections(RasConn(0), structSize, ConnectionsCount)
    CheckConnections = ConnectionsCount - ConnCount
    ConnCount = ConnectionsCount
End Function

til at overvåger forbindelsen.

Hvad skal jeg gøre for at se hvornår forbindelsen er oprettet ?
Avatar billede mukke Nybegynder
28. oktober 1999 - 21:12 #1
Hold øje med en IP.

Lav en timer der f.eks. hvert sekund ser om computeren har en IP. Hvis det er tilfældet (og den er forsk. fra 127.0.0.1 eller hvad den nu ellers siger), har du forbindelse.

Det lyder måske ikke særlig elegant, men er faktisk den måde Distributed.Net's klient virker på.

/Mukke
Avatar billede brian Nybegynder
28. oktober 1999 - 22:49 #2
Hej Mukke

Har selv tænk OG prøvet, men jeg deler min forbindelse over netværk med WinGate og har derfor fast IP, så den løsning kan kun bruges hvis jeg bruger en flydende IP som igen giver problemer med WinGate.

Tjah, det er ikke nemt.
Avatar billede steffentchr Nybegynder
31. oktober 1999 - 22:23 #3
OK, jeg har selv efterhånden brugt 50 timer på et program ligesom det, du omtaler, så jeg har en ide om hvor store problemer, du har.

Hvis du ikke vil bruge mit, gratis, gode, freeware program (tjah, må man ikke reklamere), som kan hentes fra www.refresh.dk/dolphine, så er løsning simpelthen at bruge en timer, der checker hvert minut.


Sådan ser mine funktioner ud. Jeg bruger også en timer til at checke. Man kan selv lave en dialer ud fra DialUp Networking (Netværk via Modem)-fukntionerne. Her kan man så få en Call-back procedure, som fortæller dig lige præcis hvor langt du er kommer processen, men der er lidt ligegyldigt. Skulle du få lyst til at lege med det, kan du sende mig en mail, for jeg har siddet og leget med at integerere en dialer i programmet. Bare en strøtanke.

Private Const RAS_MaxDeviceType = 16
Private Const RAS95_MaxDeviceName = 128
Private Const RAS95_MaxEntryName = 256
Private Type RASCONN95
    'set dwsize to 412
    dwSize As Long
    hRasConn As Long
    szEntryName(RAS95_MaxEntryName) As Byte
    szDeviceType(RAS_MaxDeviceType) As Byte
    szDeviceName(RAS95_MaxDeviceName) As Byte
End Type
Private Type RASENTRYNAME95
    'set dwsize to 264
    dwSize As Long
    szEntryName(RAS95_MaxEntryName) As Byte
End Type


Private Declare Function RasEnumConnections Lib "RasApi32.dll" Alias "RasEnumConnectionsA" (lprasconn As Any, lpcb As Long, lpcConnections As Long) As Long
Private Declare Function RasEnumEntries Lib "RasApi32.dll" Alias "RasEnumEntriesA" (ByVal Reserved As String, ByVal lpszPhonebook As String, lprasentryname As Any, lpcb As Long, lpcEntries As Long) As Long


Function EnumConnections() As String
    'Returnerer alle DUN-forbindelser sepereret af |||. Kan loades ind i array vha. arr = Split(EnumConnections, "|||")
    Dim s As Long, l As Long, ln As Long, a$
    ReDim R(255) As RASENTRYNAME95
   
    R(0).dwSize = 264
    s = 256 * R(0).dwSize
    l = RasEnumEntries(vbNullString, vbNullString, R(0), s, ln)
    For l = 0 To ln - 1
        a$ = StrConv(R(l).szEntryName(), vbUnicode)
        strTemp = strTemp & "|||" & Left$(a$, InStr(a$, Chr$(0)) - 1)
    Next
    EnumConnections = Right(strTemp, Len(strTemp) - 3)
End Function


Function ActiveConn() As String
    'Returnere navnet på den aktive DUN-forbindelse
    Dim s As Long, l As Long, ln As Long, a$, b$
   
    ReDim R(255) As RASCONN95
   
    R(0).dwSize = 412
    s = 256 * R(0).dwSize
    l = RasEnumConnections(R(0), s, ln)
    For l = 0 To ln - 1
        a$ = StrConv(R(l).szEntryName(), vbUnicode)
        a$ = Left$(a$, InStr(a$, Chr$(0)) - 1)
        ActiveConn = a$
'        If a$ = b$ Then MsgBox "Connected (or connecting)!": Exit Sub
    Next

End Function



Held og lykke med dit projekt. Også selv om jeg ikke er vild med konkurrencen! Jeg vil gerne høre mere om det, hvis det bliver seriøst. Skulle du få brug for nogle ideer, skal du bare bede om en smule kode. Jeg har efterhånde ikke så få i Dolphine Internet Statistik II projektet.

Steffen Tiedemann Christensen
steffen@refresh.dk
Dolphine Software, www.refresh.dk/dolphine
Refresh Intermedia, www.refresh.dk
Avatar billede brian Nybegynder
01. november 1999 - 00:32 #4
Dette spørgsmål er lukket, da jeg selv har løst problemet.Steffen får dog 50% af pointene, da jeg ikke var hurtig nok til at lukke det.
OK Steffen ?
Avatar billede januskh Nybegynder
04. november 1999 - 19:39 #5
Jeg hart selv haft et lignende problem, da jeg kodede en form for dialup styring for mit arbejde. Jeg kan anbefale at du downloader en fil fra Microsoft (en dll source, med alle de her api kald). Filen hedder VB32RAS.ZIP.

Måden jeg kontrollerer om der er forbindelse til internettet, er vha ping. Gode ping rutiner findes på www.planet-sourcecode.com/vb. Her søger du simpelthen blot på PING. Så skriver du koden om så den eksempelvis 'pinger' www.altavista.com eller lign.

Med venlig hilsen

Janus Kamp Hansen
Systemudvikler og webmaster
EDB-Afdelingen
Nordisk Solar A/S
Avatar billede mukke Nybegynder
04. november 1999 - 21:29 #6
Janus: problemet med at pinge er, at computeren i visse tilfælde vil visse et nyt dial-up vindue, hvis du forsøger at pinge. Og det ville jeg i hvert blive irriteret over...
Avatar billede brian Nybegynder
05. november 1999 - 10:38 #7
Løsningen er :

Private Declare Function RasEnumConnections Lib "RasApi32.dll" Alias "RasEnumConnectionsA" (lprasconn As Any, lpcb As Long, lpcConnections As Long) As Long
Private Declare Function RasGetConnectStatus Lib "RasApi32.dll" Alias "RasGetConnectStatusA" (ByVal hRasConn As Long, lpRASCONNSTATUS As Any) As Long

Private Const RAS95_MaxEntryName = 256
Private Const RAS_MaxDeviceType = 16
Private Const RAS95_MaxDeviceName = 128
Private Const RASCS_DONE = &H2000&

Type RASCONN95
    dwSize As Long
    hRasConn As Long
    szEntryName(RAS95_MaxEntryName) As Byte
    szDeviceType(RAS_MaxDeviceType) As Byte
    szDeviceName(RAS95_MaxDeviceName) As Byte
End Type

Type RASCONNSTATUS95
    dwSize As Long
    RasConnState As Long
    dwError As Long
    szDeviceType(RAS_MaxDeviceType) As Byte
    szDeviceName(RAS95_MaxDeviceName) As Byte
End Type

Public Function IsRASConnected() As Boolean
    Dim TRasCon(255) As RASCONN95
    Dim lg As Long
    Dim lpcon As Long
    Dim lReturn As Long
    Dim Tstatus As RASCONNSTATUS95
   
    TRasCon(0).dwSize = 412
    lg = 256 * TRasCon(0).dwSize
    lReturn = RasEnumConnections(TRasCon(0), lg, lpcon)
   
    If lReturn Then
        MsgBox "Fejl i forbindelser", vbApplicationModal + vbCritical, "Erro"
        Exit Function
    End If
   
    Tstatus.dwSize = 160
    lReturn = RasGetConnectStatus(TRasCon(0).hRasConn, Tstatus)
   
    If Tstatus.RasConnState = RASCS_DONE Then
        IsRASConnected = True
    Else
        IsRASConnected = False
    End If
End Function

On Error Resume Next
Dim Ret As Long
   
If IsRASConnected Then
'Tiden der har været forbindelse
  If OnLine Then
'Timer og diverse udregniger
  Else
'Nu starter sessionen
  End If
Else
  If OnLine Then
'Der er ikke forbindelse
  End If
End If

Man skal bare tænke sig grundigt om. Denne lid bid kode virker efter hensigten.

Brian

Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester