Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    115

    [VB6] Dato IP, restituisce il ping

    Si può, dando in input un ip e porta, dare in output il ping del server?

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,461
    L'operazione di PING è un comando specifico che ha già una porta su cui agire.

    Cerca informazioni sul protocollo ICMP e sul controllo Winsock.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    In effetti il ping su una porta non ha completamente senso ...

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    115
    Intendo come quando in DOS si scrive:
    ping (address)
    e poi lui ti dà i vari tempi di risposta dei 4 pacchetti che manda e ti fa anche una media e il ping maggiore. Sarebbe possibile fare una cosa del genere? Il più semplice possibile... a me servirebbe solo un valore... senza medie o altro se il tutto risultasse più complicato.

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Gia' ... ma avevi parlato di porte e quello che ti ho detto e' che le porte non c'entrano con il ping ...

    In ogni caso, hai due scelte ...

    1) lanci il comando PING dal dos con la Shell e fai la redirezione del risultato in un file da cui leggi il risultato

    2) scrivi da zero tutto l'algoritmo del ping con le varie chiamate alle API e con le strutture che servono

    La prima soluzione e' la piu' semplice ... la seconda e' infatti abbastanza complessa e corposa, ma trovi degli esempi di ping se fai una ricerca su google ...

    P.S. Pensavo avessi rinunciato al problema ... dopo tanto tempo ...

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    115
    Non ci rinuncio :P
    Comunque si, la prima è più semplice anche perchè in genere (tranne pochi casi) i file VB si eseguono su macchine windows con il DOS...
    Non so se ti ricordi di me ma sono quello che una volta chiedeva per il webbrowser... che mi rimproveravi per non sapere quasi nulla di VB6 e voler fare cose che non sapevo fare
    Beh.. sono quasi allo stesso punto dell'altra volta

    Shell... XD
    Qu-est ce que c'est?

  7. #7
    Inserisci il seguente codice in un modulo:
    codice:
    Option Explicit
    Private Declare Function GetTempFileName_ Lib "kernel32" Alias "GetTempFileNameA" (ByVal lpszPath As String, ByVal lpPrefixString As String, ByVal wUnique As Long, ByVal lpTempFileName As String) As Long
    Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
    Private Const INFINITE = &HFFFF      '  Infinite timeout
    Private Const WAIT_FAILED = -1&
    Private Const SYNCHRONIZE = &H100000
    
    Private Function GetTempFileName() As String
        Dim buffer As String * 260
        If GetTempFileName_(Environ("temp"), "pin", 0, buffer) = 0 Then Err.Raise 51
        GetTempFileName = Left(buffer, InStr(buffer, Chr$(0)) - 1)
    End Function
    Public Function Ping(ByVal host As String) As Integer
        Dim tempFile As String
        Dim tFN As Integer
        Dim unparsedString As String
        Dim procHandle As Long
        Dim msPos As Long
        Dim delimPos As Long
        Ping = -1
        tempFile = GetTempFileName()
        procHandle = OpenProcess(SYNCHRONIZE, 0, Shell(Environ("comspec") & " /c ping -n 1 " & host & " > " & tempFile, vbHide))
        If WaitForSingleObject(procHandle, INFINITE) = WAIT_FAILED Then Err.Raise 51
        CloseHandle procHandle
        tFN = FreeFile()
        Open tempFile For Input As tFN
        Do
            Line Input #tFN, unparsedString
            msPos = InStr(unparsedString, "ms ")
            If msPos Then
                delimPos = Max(InStrRev(unparsedString, " ", msPos), InStrRev(unparsedString, "<", msPos), InStrRev(unparsedString, "=", msPos)) + 1
                On Error Resume Next
                Ping = Mid$(unparsedString, delimPos, msPos - delimPos)
                Exit Do
            End If
        Loop Until EOF(tFN)
        Close tFN
        Kill tempFile
    End Function
    Private Function Max(ParamArray values() As Variant) As Variant
        Dim counter As Long
        For counter = LBound(values) To UBound(values)
            If values(counter) > Max Then Max = values(counter)
        Next
    End Function
    e quindi per effettuare il ping di un host richiama la funzione Ping passandole come parametro il nome dell'host. Ad esempio
    codice:
    Public Sub Main()
    MsgBox Ping("google.com")
    End Sub
    ti mostrerà il tempo di ping dal tuo PC a google.com in millisecondi. La funzione restituisce 0 in caso di problemi (l'host non risponde, non è possibile risolvere il nome, ...).
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    115
    Scusate per il ritardo a rispondere! Grazie 1000!!!!!!!! Funzia alla grande! Per fare un ping ancora più affidabile con un ciclo for gli faccio fare una media di 5 pingate così viene diciamo più "realistico". Grazie ancora!

  9. #9
    Non c'è di che.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.