Newsgroup: it.comp.appl.access
Titolo: test sulla rete

ciao
ho un PC portatile che si collega in rete, questa è mappata con il 
classico f:\...
Devo capire se il pc sia in rete oppure no
Per ora ho fatto come segue
Sub rete()
Dim Rete
Rete = "F:\UIL"
Rete = Dir(Rete, vbDirectory)
  If Len(Rete) = 0 Then
     MsgBox "non in rete"
     ' istruzioni 1
  Else
     MsgBox "sono in rete"
     ' istruzioni 2
  End If
End Sub
Oddio funziona non c'è che dire ma mi sempre un po' light
Chi mi può dare una qualche dritta in più su come gestire le reti con 
access?
Grazie a tutti e Buona Pasqua
Fabio

 ha scritto nel messaggio 
news:4615d0b1$0$3819$5402...@news.sunrise.ch...
ciao




Fabio
[risposta]
Mhmm... Quindi ti vorresti creare un pacchetto dati TCP/IP, inviarlo alla 
rete, controllare se il router non ti faccia scadere il pacchetto per 
controllare l'errore e regolarti di conseguenza?
Tutto in VBA?
Ciao.
-- 
Sergio MAZZA 

 Fabio
Altrettanto,
--
Lorenzo
Private Type IP_OPTION_INFORMATION
    TTL As Byte                   ' Time to Live (used for traceroute)
    Tos As Byte                   ' Type of Service (usually 0)
    FLAGS As Byte                 ' IP header Flags (usually 0)
    OptionsSize As Long           ' Size of Options data (usually 0, max 40)
    OptionsData As String * 128   ' Options data buffer
End Type
Private Type IP_ECHO_REPLY
    Address(0 To 3) As Byte           ' Replying Address
    Status As Long                    ' Reply Status
    RoundTripTime As Long             ' Round Trip Time in milliseconds
    DataSize As Integer               ' reply data size
    Reserved As Integer               ' for system use
    Data As Long                      ' pointer to echo data
    Options As IP_OPTION_INFORMATION  ' Reply Options
End Type
Private Type HostEnt
    h_name As Long
    h_aliases As Long
    h_addrtype As Integer
    h_length As Integer
    h_addr_list As Long
End Type
Private Const INADDR_NONE = &HFFFF
Private Const hostent_size = 16
Private Const PF_INET = 2
Private Declare Function IcmpCreateFile Lib "icmp.dll" () As Long
Private Declare Function IcmpCloseHandle Lib "icmp.dll" _
   (ByVal HANDLE As Long) As Boolean
Private Declare Function IcmpSendEcho Lib "ICMP" _
   (ByVal ICMPHandle As Long, _
   ByVal DestAddress As Long, ByVal RequestData As String, _
   ByVal RequestSize As Integer, _
   RequestOptns As IP_OPTION_INFORMATION, _
   ReplyBuffer As IP_ECHO_REPLY, _
   ByVal ReplySize As Long, _
   ByVal timeout As Long) As Boolean
Private Declare Function inet_addr Lib "wsock32.dll" _
   (ByVal cp As String) As Long
Private Declare Function gethostbyname Lib "wsock32.dll" _
   (ByVal host_name As String) As Long
Private Declare Sub MemCopy Lib "kernel32" _
   Alias "RtlMoveMemory" _
   (Dest As Any, Src As Any, ByVal cb&)
Private Declare Function gethostbyaddr Lib "wsock32.dll" _
   (addr As Long, ByVal addr_len As Long, _
   ByVal addr_type As Long) As Long
Private Declare Function inet_ntoa Lib "wsock32.dll" _
   (ByVal inn As Long) As Long
Private Declare Function lstrlen Lib "kernel32" _
   Alias "lstrlenA" (ByVal lpString As Any) As Long
Public Function Ping(Host As String)
Dim ICMPHandle As Long
' Get IP Address
If inet_addr(Host) = INADDR_NONE Then
Host = DNSLookup(Host)
If Host = "" Then Exit Function
End If
ICMPHandle = IcmpCreateFile()
If ICMPHandle = 0 Then Exit Function ' Error
Dim IPOption As IP_OPTION_INFORMATION
IPOption.TTL = "255"
Dim buf As String
buf = String$(32, 0) ' Intialize Buffer
Dim IPReply As IP_ECHO_REPLY
If IcmpSendEcho(ICMPHandle, GetHostByNameAlias(Host), _
   buf, 32, IPOption, IPReply, Len(IPReply) + 8, 2700) _
   = False Then Ping = "Request Timed Out"
If Ping = "" Then Ping = GetICMPError$(CInt(IPReply.Status))
If Ping = "" Then Ping = IPReply.RoundTripTime
Call IcmpCloseHandle(ICMPHandle)
End Function
Private Function GetHostByNameAlias(ByVal hostname$) As Long
    On Error Resume Next
    Dim phe&
    Dim heDestHost As HostEnt
    Dim addrList&
    Dim retIP&
    retIP = inet_addr(hostname)
    If retIP = INADDR_NONE Then
        phe = gethostbyname(hostname)
        If phe <> 0 Then
            MemCopy heDestHost, ByVal phe, hostent_size
            MemCopy addrList, ByVal heDestHost.h_addr_list, 4
            MemCopy retIP, ByVal addrList, heDestHost.h_length
          Else
            retIP = INADDR_NONE
        End If
    End If
    GetHostByNameAlias = Trim$(retIP)
    If Err Then GetHostByNameAlias = INADDR_NONE
End Function
Private Function DNSLookup(ByVal Address As String) As String
If inet_addr(Address) <> INADDR_NONE Then
DNSLookup = IpToAddr(Address)
ElseIf gethostbyname(Address) <> 0 Then DNSLookup = AddrToIP(Address)
End If
End Function
Private Function GetICMPError(Error As Integer) As String
Select Case Error
    Case 11001: GetICMPError = "Buffer too Small"
    Case 11002: GetICMPError = "Destination Network Not Reachable"
    Case 11003: GetICMPError = "Destination Host Not Reachable"
    Case 11004: GetICMPError = "Destination Protocol Not Reachable"
    Case 11005: GetICMPError = "Destination Port Not Reachable"
    Case 11006: GetICMPError = "No Resources Available"
    Case 11007: GetICMPError = "Bad Option"
    Case 11008: GetICMPError = "Hardware Error"
    Case 11009: GetICMPError = "Packet too Big"
    Case 11010: GetICMPError = "Request Timed Out"
    Case 11011: GetICMPError = "Bad Request"
    Case 11012: GetICMPError = "Bad Route"
    Case 11013: GetICMPError = "TTL Expired in Transit"
    Case 11014: GetICMPError = "TTL Expired Reassembly"
    Case 11015: GetICMPError = "Parameter Problem"
    Case 11016: GetICMPError = "Source Quench"
    Case 11017: GetICMPError = "Option too Big"
    Case 11018: GetICMPError = "Bad Destination"
    Case 11019: GetICMPError = "Address Deleted"
    Case 11020: GetICMPError = "Spec MTU Change"
    Case 11021: GetICMPError = "MTU Change"
    Case 11022: GetICMPError = "Unload"
    Case 11050: GetICMPError = "General Failure"
End Select
End Function
Private Function IpToAddr(ByVal AddrOrIP$) As String
    On Error Resume Next
    IpToAddr = GetHostByAddress(GetHostByNameAlias(AddrOrIP$))
    If Err Then IpToAddr = ""
End Function
Private Function AddrToIP(ByVal AddrOrIP$) As String
    AddrToIP$ = GetAscIp(GetHostByNameAlias(AddrOrIP$))
End Function
Private Function GetHostByAddress(ByVal addr As Long) As String
    On Error Resume Next
    Dim phe&, ret&
    Dim heDestHost As HostEnt
    Dim hostname$
    phe = gethostbyaddr(addr, 4, PF_INET)
      If phe <> 0 Then
        MemCopy heDestHost, ByVal phe, hostent_size
        hostname = String(256, 0)
        MemCopy ByVal hostname, ByVal heDestHost.h_name, 256
        GetHostByAddress = Left(hostname, _
                     InStr(hostname, Chr(1)) - 1)
    Else
        GetHostByAddress = ""
    End If
    If Err Then GetHostByAddress = ""
End Function
Private Function GetAscIp(ByVal inn As Long) As String
    On Error Resume Next
    Dim lpStr&
    Dim nStr&
    Dim retString$
    retString = String(32, 0)
    lpStr = inet_ntoa(inn)
    If lpStr = 0 Then
        GetAscIp = ""
        Exit Function
    End If
    nStr = lstrlen(lpStr)
    If nStr > 32 Then nStr = 32
    MemCopy ByVal retString, ByVal lpStr, nStr
    retString = Left(retString, nStr)
    GetAscIp = retString
    If Err Then GetAscIp = ""
End Function

 Devo capire se il pc sia in rete oppure no
Qui trovi la funzione pingip():
http://groups.google.it/group/it.comp.appl.access/browse_frm/thread/fbfe671cf78e4c12/4924fbf43d423d2a?lnk=gst&q=pingip&rnum=1#4924fbf43d423d2a
che puoi usare per testare se un pc remoto risponde alle richieste
echo.
Su 
www.sitocomune.com
 trovi invece una funzione che ti restituisce
l'ip del tuo computer. Combinate insieme, le due funzioni possono
tornare utili, anche se con dei distinguo.
Se il tuo pc non ha indirizzo ip, normalmente significa che non è in
rete (poi se hai robe tipo vmware, schede di rete virtuali o altri
ammenicoli, puoi avere indirizzi ip configurati anche se non sei in
rete).
Se il ping al pc remoto non va a buon fine, potrebbe significare che
c'è un firewall che blocca le richieste echo, ma le unità remote
mappate magari le vedi lo stesso.
Alla fine, visto che ti occorre verificare la disponibilità di una
unità remota, mi sa che la funzione migliore sia proprio quella che
hai scritto :-)
ciao,
Panathos

 ha scritto nel messaggio 
news:4615f50c$0$3815$5402...@news.sunrise.ch...
Quel mhmm, poi con la M maiuscola, mi ha già spaventato ;-)
[risposta]
Mai quanto a me, la tua richiesta.
Penso che, per il mio caso, possa risolvere con il codice sopra citato.
[risposta]
Eh! Eh!
ho aggiunto che, se capitasse un errore, es. stacco il cavo di rete, mi
considera come non in rete e mi esegue le "istruzioni 1". Ma mi sembrava
il tutto un po' semplice. Comunque funziona.
[risposta]
E non potrebbe essere altrimenti.
Grazie Sergio e buona Pasqua
[risposta]
E di che? Buona Pasqua anche a te...
Fabio
[risposta]
Ciao.
-- 
Sergio MAZZA 

Lorenzo(pyx) ha scritto:

Ben spaventato, rigrazio
Fabio