Avatar billede herbert Nybegynder
07. juni 2001 - 12:09 Der er 8 kommentarer og
1 løsning

IP og winsock

Jeg r ved at lave 1 prg som hele tiden viser mig hvad min IP r. Jeg bruger noget kode der ligner d her:

Private Sub Timer1_Timer()
Text1 = Winsock1.LocalIP
End Sub

Min IP er seføli 127.0.0.1 når jeg r offline, og når jeg så kobler på nettet skulle winsock1.localIP gerne skifte værdi men d gør den ikke... Den bliver ved med at sige 127.0.0.1 . Jeg skal stoppe mit program og så starte d igen før den winsock opdaterer sig.

Hvordan løser jeg dette problem?
Avatar billede herbert Nybegynder
07. juni 2001 - 12:10 #1
og til alle halvspaderne derude så r d ik intervallet på min timer der r noget i vejen med :O)
Avatar billede qzar Nybegynder
07. juni 2001 - 12:12 #2
Du skal vel bare sætte en updater på!
Avatar billede qzar Nybegynder
07. juni 2001 - 12:13 #3
Så den opdatere feks hvert sec!
Avatar billede herbert Nybegynder
07. juni 2001 - 12:21 #4
der r ik noget der hedder winsock1.update
Avatar billede herbert Nybegynder
07. juni 2001 - 12:23 #5
ligenu lejer med noget ala d her:

Private Sub Timer1_Timer()
Shell (\"ping localhost > c:\\ping.log\"), vbHide
End Sub

og så læse ip\'en ud af ping.log
Avatar billede NanoQ Nybegynder
07. juni 2001 - 13:03 #6
det hedder \"er\", \"det\", \"ikke\" osv...

sorry... kunne ikke lade være... ;)
Avatar billede herbert Nybegynder
07. juni 2001 - 13:54 #7
men ping localhost opdaterer sig heller ikke! ævævævævæv
Avatar billede winkill Nybegynder
07. juni 2001 - 14:21 #8
Herbert > Hvis det hjælper at genstarte programmet burde det være muligt at nøjes med at genindlæse din socket.

Placer en winsock på din form og fjern den derefter igen (blot for derved at sikrer at referencen til mswinsck.ocx er indlæst) og prøv så med:

Private Sub Timer1_Timer()
    Dim WS As New WinSock
    Text1.Text = WS.LocalIP
    Set WS = Nothing
End Sub
Avatar billede jper Nybegynder
08. juni 2001 - 11:34 #9
Herbert localhost er ALTID 127.0.0.1 derfor skal du pinge maskinnavnet, hvis det skal virke.

Jeg har klippet lidt fra MSDN og rettet det til så du kan bruge timeren.

Lav et nyt exe projekt på formen placere du en timer med navnet timer1 og sætter nedenstående ind i kode vinduet, det virker når du er offline og skifter til online og får ny IP.

Bemærk resultat (IP og maskine navn) bliver skrevet ud til Immediate vinduet:

  Private Const WS_VERSION_REQD = &H101
  Private Const WS_VERSION_MAJOR = WS_VERSION_REQD \\ &H100 And &HFF&
  Private Const WS_VERSION_MINOR = WS_VERSION_REQD And &HFF&
  Private Const MIN_SOCKETS_REQD = 1
  Private Const SOCKET_ERROR = -1
  Private Const WSADescription_Len = 256
  Private Const WSASYS_Status_Len = 128

  Private Type HOSTENT
      hName As Long
      hAliases As Long
      hAddrType As Integer
      hLength As Integer
      hAddrList As Long
  End Type

  Private Type WSADATA
      wversion As Integer
      wHighVersion As Integer
      szDescription(0 To WSADescription_Len) As Byte
      szSystemStatus(0 To WSASYS_Status_Len) As Byte
      iMaxSockets As Integer
      iMaxUdpDg As Integer
      lpszVendorInfo As Long
  End Type

  Private Declare Function WSAGetLastError Lib \"WSOCK32.DLL\" () As Long
  Private Declare Function WSAStartup Lib \"WSOCK32.DLL\" (ByVal _
  wVersionRequired As Integer, lpWSAData As WSADATA) As Long
  Private Declare Function WSACleanup Lib \"WSOCK32.DLL\" () As Long
 
  Private Declare Function gethostname Lib \"WSOCK32.DLL\" (ByVal hostname$, ByVal HostLen As Long) As Long
  Private Declare Function gethostbyname Lib \"WSOCK32.DLL\" (ByVal _
  hostname$) As Long
  Private Declare Sub RtlMoveMemory Lib \"KERNEL32\" (hpvDest As Any, ByVal hpvSource&, ByVal cbCopy&)

  Function hibyte(ByVal wParam As Integer)

      hibyte = wParam \\ &H100 And &HFF&

  End Function

  Function lobyte(ByVal wParam As Integer)

      lobyte = wParam And &HFF&

  End Function

  Sub SocketsInitialize()
  Dim WSAD As WSADATA
  Dim iReturn As Integer
  Dim sLowByte As String, sHighByte As String, sMsg As String

      iReturn = WSAStartup(WS_VERSION_REQD, WSAD)

      If iReturn <> 0 Then
          MsgBox \"Winsock.dll is not responding.\"
          End
      End If

      If lobyte(WSAD.wversion) < WS_VERSION_MAJOR Or (lobyte(WSAD.wversion) = _
          WS_VERSION_MAJOR And hibyte(WSAD.wversion) < WS_VERSION_MINOR) Then

          sHighByte = Trim$(Str$(hibyte(WSAD.wversion)))
          sLowByte = Trim$(Str$(lobyte(WSAD.wversion)))
          sMsg = \"Windows Sockets version \" & sLowByte & \".\" & sHighByte
          sMsg = sMsg & \" is not supported by winsock.dll \"
          MsgBox sMsg
          End
      End If

      \'iMaxSockets is not used in winsock 2. So the following check is only
      \'necessary for winsock 1. If winsock 2 is requested,
      \'the following check can be skipped.

      If WSAD.iMaxSockets < MIN_SOCKETS_REQD Then
          sMsg = \"This application requires a minimum of \"
          sMsg = sMsg & Trim$(Str$(MIN_SOCKETS_REQD)) & \" supported sockets.\"
          MsgBox sMsg
          End
      End If

  End Sub

  Sub SocketsCleanup()
  Dim lReturn As Long

      lReturn = WSACleanup()

      If lReturn <> 0 Then
          MsgBox \"Socket error \" & Trim$(Str$(lReturn)) & \" occurred in Cleanup \"
          End
      End If

  End Sub

  Sub Form_Load()

      SocketsInitialize

  End Sub

  Private Sub Form_Unload(Cancel As Integer)

      SocketsCleanup

  End Sub



Private Sub Timer1_Timer()
  Dim hostname As String * 256
  Dim hostent_addr As Long
  Dim host As HOSTENT
  Dim hostip_addr As Long
  Dim temp_ip_address() As Byte
  Dim i As Integer
  Dim ip_address As String

      If gethostname(hostname, 256) = SOCKET_ERROR Then
          MsgBox \"Windows Sockets error \" & Str(WSAGetLastError())
          Exit Sub
      Else
          hostname = Trim$(hostname)
      End If

      hostent_addr = gethostbyname(hostname)

      If hostent_addr = 0 Then
          MsgBox \"Winsock.dll is not responding.\"
          Exit Sub
      End If

      RtlMoveMemory host, hostent_addr, LenB(host)
      RtlMoveMemory hostip_addr, host.hAddrList, 4

      Debug.Print hostname

      \'get all of the IP address if machine is  multi-homed

      Do
          ReDim temp_ip_address(1 To host.hLength)
          RtlMoveMemory temp_ip_address(1), hostip_addr, host.hLength

          For i = 1 To host.hLength
              ip_address = ip_address & temp_ip_address(i) & \".\"
          Next
          ip_address = Mid$(ip_address, 1, Len(ip_address) - 1)

          Debug.Print ip_address

          ip_address = \"\"
          host.hAddrList = host.hAddrList + LenB(host.hAddrList)
          RtlMoveMemory hostip_addr, host.hAddrList, 4
        Loop While (hostip_addr <> 0)


End Sub
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