by ゲスト » 2008年1月24日(木) 11:01
あらら、数秒もNGですか。
では、Pingを打ってみてはどうでしょう?
UDPなのでリトライ無しと言う訳にはいきませんが、小さいネットワーク内で
利用するならタイムアウト値を小さくすれば何とかなると思います。
私は試した事が無いのですが、過去の掲示板に記載が有りました。
(ABのバージョンが違うので少し手直しが必要だと思います。)
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
投稿時間:2004/07/28(Wed) 22:35
投稿者名:situmon
Eメール:bewdr@hotmail.com
URL :
タイトル:Re^3: ネットワーク監視
> はい、pingとtracertを操作したいと考えています。
tracertはやってませんが、一応Pingの方ならやった事が有ります。
Pingの簡易的な関数を作ってあるのですが、バラして説明する
時間が無いのでサンプル付で貼りますので参考にどうぞ。
但し、長いです。
'関数等の定義
Const WS_VERSION_REQD As Long = &H101
Const WSADESCRIPTION_LEN = 256
Const WSASYS_STATUS_LEN = 128
Type PIP_OPTION_INFORMATION
Ttl As Byte '生存時間
Tos As Byte 'ICMPタイプ
Flags As Byte 'フラグ
Optsize As Byte 'オプション長
Options As Long 'オプション
End Type
Type ICMP_ECHO_REPLY
Address As Long 'IPアドレス
status As Long 'コード
TripTime As Long '応答時間(ms)
DataSize As Long 'バッファサイズ
' Reserved As Integer '予備
DataPointer As Long 'データポインタ
IPOptions As PIP_OPTION_INFORMATION
ReplyData(255) As String 'レスポンス領域
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 WSAData
wVersion As Integer
wHighVersion As Integer
szDescription(WSADESCRIPTION_LEN) As Byte
szSystemStatus(WSASYS_STATUS_LEN) As Byte
iMaxSockets As Integer
iMaxUdpDg As Integer
lpVendorInfo As Long
End Type
Declare Function IcmpCreateFile Lib "ICMP.DLL" () As Long
Declare Function IcmpCloseHandle Lib "ICMP.DLL" (ByVal IcmpHandle As Long) As Integer
Declare Function IcmpSendEcho Lib "ICMP.DLL" (ByVal IcmpHandle As Long, ByVal DestinationAddress As Long, ByVal RequestData As String,ByVal RequestSize As Long,ByRef RequestOptions As PIP_OPTION_INFORMATION,ByRef ReplyBuffer As ICMP_ECHO_REPLY,ByVal ReplySize As Long,ByVal Timeout As Long) As Long
Declare Function gethostbyname Lib "wsock32.dll" (ByVal strName As String) As Long
Declare Function WSAStartup Lib "wsock32.dll" (ByVal wVersionRequested As Long,ByRef lpWSAData As WSAData) As Long
Declare Function WSACleanup Lib "wsock32.dll" () As Long
Const INADDR_NONE = &HFFFF
Function GIPADD(ByVal ipstr As String) As Long
Dim lhost As Long
Dim uhost As hostent
Dim lhostbAdd As Long
Dim lhostAdd As Long
lhost=gethostbyname(ipstr)
If lhost <> 0 Then
memcpy(VarPtr(uhost),lhost,Len(uhost))
With uhost
memcpy(VarPtr(lhostbAdd),.h_addr_list,Len(lhostbAdd))
memcpy(VarPtr(lhostAdd),lhostbAdd,.h_length)
End With
GIPADD=lhostAdd
Else
GIPADD=0
End If
End Function
Function PINGHOST(ByVal ICMPHANDL As Long,ByVal HOSTBUF As String,ByVal TTLBYTE As Byte,ByVal TIMEOUT As Long,ByVal DATASIZE As Long) As Long
Dim INFO As PIP_OPTION_INFORMATION
Dim ECHO As ICMP_ECHO_REPLY
Dim NETWADD As Long
Dim APILONG As Long
NETWADD=GIPADD(HOSTBUF)
INFO.Ttl=TTLBYTE
APILONG=IcmpSendEcho(ICMPHANDL,NETWADD,String$(DATASIZE,Chr$(0)),DATASIZE,INFO,ECHO,Len(ECHO),TIMEOUT)
If Not(APILONG=0) Then
PINGHOST=1
Else
PINGHOST=0
End If
End Function
Function STARTIMCP() As Long
Dim PINLHAND As Long
PINLHAND=IcmpCreateFile()
STARTIMCP=PINLHAND
End Function
Sub ENDICMP(ICMPHAND As Long)
IcmpCloseHandle(ICMPHAND)
End Sub
Sub SOCKSTART(ByVal VARSION As Long)
Dim WDATA As WSAData
Dim APILONG As Long
If VARSION=1 Then
APILONG=WSAStartup(MAKEWORD(1,1),WDATA)
Else
APILONG=WSAStartup(MAKEWORD(2,2),WDATA)
End If
End Sub
Sub ENDSOCK()
WSACleanup()
End Sub
'ここからがプログラム本体
SOCKSTART(1)
Dim ICMPHAND As Long
Dim M As String
'STARTIMCPはICMPハンドルを作成する関数です
ICMPHAND=STARTIMCP()
'PINGHOSTはPINGを実行する関数です
'PINGHOST(ICMPハンドル,ホスト名 Or IPアドレス,TTLの値,タイムアウトまでの時間,送信するデータ量)
If PINGHOST(ICMPHAND,"127.0.0.1",120,1000,30)=1 Then
M="Ping成功"
Else
M="Ping失敗"
End If
MsgBox 0,M,"Ping",MB_OK
ENDICMP(ICMPHAND)
'ENDICMPはICMPハンドルを閉じる関数です
'ENDICMP(ICMPハンドル)
ENDSOCK()
以上です。
あらら、数秒もNGですか。
では、Pingを打ってみてはどうでしょう?
UDPなのでリトライ無しと言う訳にはいきませんが、小さいネットワーク内で
利用するならタイムアウト値を小さくすれば何とかなると思います。
私は試した事が無いのですが、過去の掲示板に記載が有りました。
(ABのバージョンが違うので少し手直しが必要だと思います。)
[hide][code]投稿時間:2004/07/28(Wed) 22:35
投稿者名:situmon
Eメール:bewdr@hotmail.com
URL :
タイトル:Re^3: ネットワーク監視
> はい、pingとtracertを操作したいと考えています。
tracertはやってませんが、一応Pingの方ならやった事が有ります。
Pingの簡易的な関数を作ってあるのですが、バラして説明する
時間が無いのでサンプル付で貼りますので参考にどうぞ。
但し、長いです。
'関数等の定義
Const WS_VERSION_REQD As Long = &H101
Const WSADESCRIPTION_LEN = 256
Const WSASYS_STATUS_LEN = 128
Type PIP_OPTION_INFORMATION
Ttl As Byte '生存時間
Tos As Byte 'ICMPタイプ
Flags As Byte 'フラグ
Optsize As Byte 'オプション長
Options As Long 'オプション
End Type
Type ICMP_ECHO_REPLY
Address As Long 'IPアドレス
status As Long 'コード
TripTime As Long '応答時間(ms)
DataSize As Long 'バッファサイズ
' Reserved As Integer '予備
DataPointer As Long 'データポインタ
IPOptions As PIP_OPTION_INFORMATION
ReplyData(255) As String 'レスポンス領域
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 WSAData
wVersion As Integer
wHighVersion As Integer
szDescription(WSADESCRIPTION_LEN) As Byte
szSystemStatus(WSASYS_STATUS_LEN) As Byte
iMaxSockets As Integer
iMaxUdpDg As Integer
lpVendorInfo As Long
End Type
Declare Function IcmpCreateFile Lib "ICMP.DLL" () As Long
Declare Function IcmpCloseHandle Lib "ICMP.DLL" (ByVal IcmpHandle As Long) As Integer
Declare Function IcmpSendEcho Lib "ICMP.DLL" (ByVal IcmpHandle As Long, ByVal DestinationAddress As Long, ByVal RequestData As String,ByVal RequestSize As Long,ByRef RequestOptions As PIP_OPTION_INFORMATION,ByRef ReplyBuffer As ICMP_ECHO_REPLY,ByVal ReplySize As Long,ByVal Timeout As Long) As Long
Declare Function gethostbyname Lib "wsock32.dll" (ByVal strName As String) As Long
Declare Function WSAStartup Lib "wsock32.dll" (ByVal wVersionRequested As Long,ByRef lpWSAData As WSAData) As Long
Declare Function WSACleanup Lib "wsock32.dll" () As Long
Const INADDR_NONE = &HFFFF
Function GIPADD(ByVal ipstr As String) As Long
Dim lhost As Long
Dim uhost As hostent
Dim lhostbAdd As Long
Dim lhostAdd As Long
lhost=gethostbyname(ipstr)
If lhost <> 0 Then
memcpy(VarPtr(uhost),lhost,Len(uhost))
With uhost
memcpy(VarPtr(lhostbAdd),.h_addr_list,Len(lhostbAdd))
memcpy(VarPtr(lhostAdd),lhostbAdd,.h_length)
End With
GIPADD=lhostAdd
Else
GIPADD=0
End If
End Function
Function PINGHOST(ByVal ICMPHANDL As Long,ByVal HOSTBUF As String,ByVal TTLBYTE As Byte,ByVal TIMEOUT As Long,ByVal DATASIZE As Long) As Long
Dim INFO As PIP_OPTION_INFORMATION
Dim ECHO As ICMP_ECHO_REPLY
Dim NETWADD As Long
Dim APILONG As Long
NETWADD=GIPADD(HOSTBUF)
INFO.Ttl=TTLBYTE
APILONG=IcmpSendEcho(ICMPHANDL,NETWADD,String$(DATASIZE,Chr$(0)),DATASIZE,INFO,ECHO,Len(ECHO),TIMEOUT)
If Not(APILONG=0) Then
PINGHOST=1
Else
PINGHOST=0
End If
End Function
Function STARTIMCP() As Long
Dim PINLHAND As Long
PINLHAND=IcmpCreateFile()
STARTIMCP=PINLHAND
End Function
Sub ENDICMP(ICMPHAND As Long)
IcmpCloseHandle(ICMPHAND)
End Sub
Sub SOCKSTART(ByVal VARSION As Long)
Dim WDATA As WSAData
Dim APILONG As Long
If VARSION=1 Then
APILONG=WSAStartup(MAKEWORD(1,1),WDATA)
Else
APILONG=WSAStartup(MAKEWORD(2,2),WDATA)
End If
End Sub
Sub ENDSOCK()
WSACleanup()
End Sub
'ここからがプログラム本体
SOCKSTART(1)
Dim ICMPHAND As Long
Dim M As String
'STARTIMCPはICMPハンドルを作成する関数です
ICMPHAND=STARTIMCP()
'PINGHOSTはPINGを実行する関数です
'PINGHOST(ICMPハンドル,ホスト名 Or IPアドレス,TTLの値,タイムアウトまでの時間,送信するデータ量)
If PINGHOST(ICMPHAND,"127.0.0.1",120,1000,30)=1 Then
M="Ping成功"
Else
M="Ping失敗"
End If
MsgBox 0,M,"Ping",MB_OK
ENDICMP(ICMPHAND)
'ENDICMPはICMPハンドルを閉じる関数です
'ENDICMP(ICMPハンドル)
ENDSOCK()
以上です。
[/code][/hide]