which is valid also for Linux for example.
Code: Select all
; 16/02/2007 TraceRoute by peterb, Gui by dige and "Domain Name to IP" added by Psychophanta
;- Window Constants
Enumeration
#hWnd
EndEnumeration
;- Gadget Constants
Enumeration
#hWnd_LI_Route
#hWnd_T_IP
#hWnd_IP_ToTrace
#hWnd_DN_ToTrace
#hWnd_IP_or_DN
#hWnd_T_Hops
#hWnd_S_Hops
#hWnd_CX_DNS
#hWnd_B_Start
EndEnumeration
Procedure.s GetIPAddress(servername.s,port.l); <- Obtener la IP dado el nombre de dominio (por la forma PB sin API externa):
Protected connectionID.l=OpenNetworkConnection(servername,port)
If connectionID=0:MessageRequester("error","Error opening connection"):ProcedureReturn "":EndIf
servername.s=IPString(GetClientIP(connectionID))
CloseNetworkConnection(connectionID)
ProcedureReturn servername.s
EndProcedure
Procedure TraceRoute ( sIPAddress.s, MaxHops.l, DNS.b )
Protected dummy.s, EchoMessage.s
EchoMessage = "echo"
ResultSize.l = SizeOf(ICMP_ECHO_REPLY) + Len(EchoMessage)
*Result = AllocateMemory(ResultSize)
*Echo.ICMP_ECHO_REPLY = *Result
ip_option.IP_OPTION_INFORMATION
If sIPAddress
ClearGadgetItemList( #hWnd_LI_Route )
hFile.l = IcmpCreateFile_()
IPAddress.l = inet_addr_(sIPAddress)
For ttl_int = 1 To MaxHops
ip_option\Ttl = ttl_int
Echo_Result.l = 0
counter.l = 0
While Echo_Result = 0 And counter < 3
counter + 1
Echo_Result = IcmpSendEcho_(hFile, IPAddress, EchoMessage, Len(EchoMessage), ip_option, *Result, ResultSize, 1500)
If Echo_Result = 1
Count + 1
dummy = Str(Count) + Chr(10) + StrU(*Echo\RoundTripTime, 2) + Chr(10)
dummy + IPString(*Echo\Address) + Chr(10)
If DNS
bip = *Echo\Address
*retval = gethostbyaddr_(@bip, 4, #AF_INET)
If *retval > 0
dummy + PeekS(PeekL(*retval))
EndIf
EndIf
AddGadgetItem( #hWnd_LI_Route, -1, dummy )
If *Echo\Status = 0 : Break 2 : EndIf
EndIf
Repeat
Event = WindowEvent()
If Event = #PB_Event_Gadget And EventGadget() = #hWnd_B_Start
Break 3
EndIf
Until Not Event
Wend
If Echo_Result = 0
dummy = Str(Count) + Chr(10) + StrU(*Echo\RoundTripTime, 2) + Chr(10)
dummy + IPString(*Echo\Address) + Chr(10) + "Unknown Address"
AddGadgetItem( #hWnd_LI_Route, -1, dummy )
EndIf
Next
IcmpCloseHandle_(hFile)
EndIf
EndProcedure
Procedure Open_hWnd()
If OpenWindow(#hWnd, 356, 307, 514, 275, "PB Trace-Route", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
If CreateGadgetList(WindowID(#hWnd))
ListIconGadget(#hWnd_LI_Route, 5, 5, 505, 240, "Nr.", 50, #PB_ListIcon_GridLines)
AddGadgetColumn(#hWnd_LI_Route, 1, "RTT", 80)
AddGadgetColumn(#hWnd_LI_Route, 2, "IP", 100)
AddGadgetColumn(#hWnd_LI_Route, 3, "Name", 265)
TextGadget(#hWnd_T_IP, 5, 255, 18, 15, "IP:")
IPAddressGadget(#hWnd_IP_ToTrace, 25, 250, 145, 20)
CheckBoxGadget(#hWnd_IP_or_DN, 180, 250, 75, 20, "IP or DN")
TextGadget(#hWnd_T_Hops, 260, 255, 55, 15, "Max. Hops:")
StringGadget(#hWnd_S_Hops, 315, 250, 35, 20, "32", #PB_String_Numeric)
SendMessage_(GadgetID(#hWnd_S_Hops), #EM_LIMITTEXT, 255, 0)
CheckBoxGadget(#hWnd_CX_DNS, 365, 250, 75, 20, "Show DNS")
ButtonGadget(#hWnd_B_Start, 445, 250, 65, 20, "Start Tracing")
EndIf
EndIf
EndProcedure
Open_hWnd()
If InitNetwork()=0
DisableGadget( #hWnd_IP_ToTrace, #True )
DisableGadget( #hWnd_B_Start, #True )
EndIf
IP = inet_addr_(GetClipboardText())
If IP <> -1
SetGadgetState( #hWnd_IP_ToTrace, IP )
EndIf
SetGadgetState( #hWnd_CX_DNS, #True )
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_CloseWindow : Break
ElseIf Event = #PB_Event_Gadget
Select EventGadget()
Case #hWnd_B_Start
If GetGadgetState(#hWnd_IP_or_DN)
SetGadgetState(#hWnd_IP_or_DN,0)
SetGadgetText(#hWnd_T_IP,"IP:")
If CreateGadgetList(WindowID(#hWnd)):IPAddressGadget(#hWnd_IP_ToTrace, 25, 250, 145, 20):EndIf
SetGadgetState(#hWnd_IP_ToTrace,inet_addr_(GetIPAddress(GetGadgetText(#hWnd_DN_ToTrace),80)))
FreeGadget(#hWnd_DN_ToTrace)
EndIf
DisableGadget(#hWnd_IP_ToTrace,#True)
SetGadgetText(#hWnd_B_Start,"Stop Tracing")
TraceRoute(GetGadgetText(#hWnd_IP_ToTrace),Val(GetGadgetText(#hWnd_S_Hops)), GetGadgetState(#hWnd_CX_DNS))
DisableGadget(#hWnd_IP_ToTrace,#False)
SetGadgetText(#hWnd_B_Start,"Start Tracing")
Case #hWnd_IP_or_DN
If GetGadgetState(#hWnd_IP_or_DN)
FreeGadget(#hWnd_IP_ToTrace)
SetGadgetText(#hWnd_T_IP,"DN:")
If CreateGadgetList(WindowID(#hWnd)):StringGadget(#hWnd_DN_ToTrace, 25, 250, 145, 20,""):EndIf
Else:DN$=""
FreeGadget(#hWnd_DN_ToTrace)
SetGadgetText(#hWnd_T_IP,"IP:")
If CreateGadgetList(WindowID(#hWnd)):IPAddressGadget(#hWnd_IP_ToTrace, 25, 250, 145, 20):EndIf
EndIf
EndSelect
EndIf
ForEver
End
;Example of usage:
If InitNetwork()=0:MessageRequester("Error","Can't initialize the network",0):End:EndIf
Debug GetIPAddress("www.terra.es",80)