ホスト名からIPアドレスを取得          <TOP>


ホスト名からIPアドレスを取得します。

gethostbyname インターネットホスト名に対応するIPアドレスを取得

WSAStartup WinSockを初期化

WSACleanup WinSock のリソースを解放

RtlMoveMemory ある位置から別の位置にメモリブロックを移動する関数

IcmpCreateFile ICMPファイルハンドルを開く

IcmpCloseHandle ICMPファイルハンドルを閉じる

IcmpSendEcho ICMPエコーを送信する

 

初期状態では、www.yahoo.co.jp が入力されています。ホスト名を入力し取得ボタンをクリックすると該当アドレスを表示し、受信に費やした時間を表示します。

 

参照
<IPアドレスからホスト名を取得>
ICMP(Internet Control Message Protocol)

IPのエラーメッセージや制御メッセージを転送するプロトコルTCP/IPで接続されたコンピュータやネットワーク機器間で、互いの状態を確認するために用いられる。

 

'================================================================
'= ホスト名からIPアドレスを取得
'=    (GetHostByName.bas)
'================================================================
#include "Windows.bi"

#define SOCKET_ERROR 0

Type WSADATA
    wVersion            As Integer
    wHighVersion        As Integer
    szDescription(255)  As byte
    szSystemStatus(128) As byte
    iMaxSockets         As Integer
    iMaxUdpDg           As Integer
    lpVEndorInfo        As Long
End Type

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

Type IP_OPTION_INFORMATION
    TTL         As byte
    Tos         As byte
    Flags       As byte
    OptionsSize As Long
    OptionsData As String * 128
End Type

Type IP_ECHO_REPLY
    Address(3)    As byte
    Status        As Long
    RoundTripTime As Long
    DataSize      As Integer
    Reserved      As Integer
    ndata         As Long
    Options       As IP_OPTION_INFORMATION
End Type

' インターネットホスト名に対応するIPアドレスを取得
Declare Function Api_gethostbyname& Lib "wsock32" Alias "gethostbyname" (ByVal HostName$)

' WinSockを初期化
Declare Function Api_WSAStartup& Lib "wsock32" Alias "WSAStartup" (ByVal VersionReq&, WSADATAReturn As WSADATA)

' WinSock のリソースを解放
Declare Function Api_WSACleanup& Lib "wsock32" Alias "WSACleanup" ()

' ある位置から別の位置にメモリブロックを移動する関数
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy&)

' ICMPファイルハンドルを開く
Declare Function Api_IcmpCreateFile& Lib "icmp" Alias "IcmpCreateFile" ()
 
' ICMPファイルハンドルを閉じる
Declare Function Api_IcmpCloseHandle& Lib "icmp" Alias "IcmpCloseHandle" (ByVal HANDLE&)

' ICMPエコーを送信する
Declare Function Api_IcmpSendEcho& Lib "icmp" Alias "IcmpSendEcho" (ByVal IcmpHandle&, ByVal DestAddress&, ByVal RequestData$, ByVal RequestSize&, RequestOptns As IP_OPTION_INFORMATION, ReplyBuffer As IP_ECHO_REPLY, ByVal ReplySize&, ByVal TimeOut&)

Var Shared Text(4) As Object
Var Shared Edit1 As Object
Var Shared Button1 As Object

For i = 0 To 4
    Text(i).Attach GetDlgItem("Text" & Trim$(Str$(i+1)))
    Text(i).SetFontSize 14
Next
Edit1.Attach GetDlgItem("Edit1") : Edit1.SetFontSize 14
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var HostName As String
    Var hFile As Long
    Var lpWSADATA As WSADATA
    Var hHostent As Hostent
    Var AddrList As Long
    Var Address As Long
    Var rIP As String
    Var OptInfo As IP_OPTION_INFORMATION
    Var EchoReply As IP_ECHO_REPLY
    Var Ret As Long

    HostName = GetDlgItemText("Edit1")
    Text(3).SetWindowText ""
    Text(4).SetWindowText ""

    Ret = Api_WSAStartup(&H101, lpWSADATA)

    If Api_GetHostByName(HostName & String$(64 - Len(HostName), 0)) <> SOCKET_ERROR Then
        CopyMemory hHostent.h_name, ByVal Api_GetHostByName(HostName & String$(64 - Len(HostName), 0)), Len(hHostent)
        CopyMemory AddrList, ByVal hHostent.h_addr_list, 4
        CopyMemory Address, ByVal AddrList, 4
    End If

    hFile = Api_IcmpCreateFile()

    If hFile = 0 Then
        Text(3).SetWindowText "ファイルハンドルを作成できません!"
        Exit Sub
    End If

    OptInfo.TTL = 255

    If Api_IcmpSendEcho(hFile, Address, String$(32, "A"), 32, OptInfo, EchoReply, Len(EchoReply) + 8, 2000) Then
        rIP = Str$(EchoReply.Address(0)) & "." & Str$(EchoReply.Address(1)) & "." & Str$(EchoReply.Address(2)) & "." & Str$(EchoReply.Address(3))
    Else
        Text(3).SetWindowText "タイムアウト!"
    End If

    If EchoReply.Status = 0 Then
        Text(3).SetWindowText rIP
        Text(4).SetWindowText Trim$(Str$(EchoReply.RoundTripTime)) & "ms"
    Else
        Text(3).SetWindowText "失敗しました!"
    End If

    Ret = Api_IcmpCloseHandle(hFile)
    Ret = Api_WSACleanup
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End