はじめまして。
いきなりの質問で申し訳ありませんが、ネットワークに接続しているかどうか、というかネットワークケーブルがささっているかどうかを知るにはどうしたらよいのでしょうか。
現在、ネットワーク上のコンピューターのファイルにアクセスできるかどうかで判断しているのですが、ネットワークに接続していない場合、少し判断に時間がかかってしまう為、瞬時に判断できるようにしたいのですが・・・。
ネットワーク接続状態の取得方法
返答ありがとうございます。
WinXPでネットワークケーブルを引っこ抜くと、タスクバーに「ケーブルが接続されていません」という表示がでるので、何か簡単にわかる方法があるのかと思い聞いてみた次第です。
教えていただいた WNetAddConnection を使ってみようと思ったのですが、自分なりに調べて試してみたものの、きちんと動作させることができていません。
WinXPでネットワークケーブルを引っこ抜くと、タスクバーに「ケーブルが接続されていません」という表示がでるので、何か簡単にわかる方法があるのかと思い聞いてみた次第です。
教えていただいた WNetAddConnection を使ってみようと思ったのですが、自分なりに調べて試してみたものの、きちんと動作させることができていません。
[ここをクリックすると内容が表示されます]
上記コードを実行すると、エラーコード487(ERROR_INVALID_ADDRESS)が返ってきます。Function の定義の仕方とか見よう見まねでやっているので、おかしいのかもしれないのですが、よくわかりません・・・。WNetAddConnectionの正しい使い方を教えていただけないでしょうか。コード: 全て選択
Declare Function WNetAddConnection Lib "mpr.dll" Alias "WNetAddConnectionA" (lpszNetPath As BytePtr, lpszPassword As BytePtr, lpszLocalName As BytePtr) As Long
Const NO_ERROR = 0
Dim ret As Long
ret=WNetAddConnection("\\hoge\hoge", NULL, NULL)
If ret=NO_ERROR Then
MessageBox(hMainWnd,"NO ERROR","",MB_OK)
Else
MessageBox(hMainWnd,Str$(ret),0,MB_OK)
End If
追伸です。
私は下記で試しました。
私は下記で試しました。
[ここをクリックすると内容が表示されます]
マイクロソフトが推奨していますので、これができたらWNetAddConnection2か3に挑戦してみてください。コード: 全て選択
Declare Function WNetAddConnection Lib "mpr.dll" Alias "WNetAddConnectionA" (lpszNetPath As BytePtr, lpszPassword As BytePtr, lpszLocalName As BytePtr) As Long
Dim strShare[MAX_PATH] As Byte ' 共有フォルダ名
Dim strPass[MAX_PATH] As Byte ' パスワード
Dim strDrive[MAX_PATH] As Byte ' ドライブ名
Dim ret As Long
lstrcpy(strShare , "\\127.0.0.1\test")
ret = WNetAddConnection(strShare, strPass, strDrive)
ゲストさんのコードを見て気付いたのですが、第3パラメータが間違っていたようです。
× ret=WNetAddConnection("\\hoge\hoge", NULL, NULL)
○ ret=WNetAddConnection("\\hoge\hoge", NULL, "")
MSDNを見たら「NULL を指定すると、ローカルデバイスのリダイレクトなしでネットワーク資源に接続します。」とあったのでNULLにしていたのですが、”NULL”ではなくて”NULL文字列”のことだったんですね・・・。
上記修正でWNetAddConnectionはきちんと動作するようになったのですが、ネットワークに接続していない場合、やはり関数が戻ってくるまで時間がかかってしまい(2~3秒くらい)、残念ながら当初の目的には合致しないようです・・・。WNetAddConnection2, 3 も試してみましたが、やはり判断に時間がかかってしまいます。
何かいい手段はないものでしょうか?
× ret=WNetAddConnection("\\hoge\hoge", NULL, NULL)
○ ret=WNetAddConnection("\\hoge\hoge", NULL, "")
MSDNを見たら「NULL を指定すると、ローカルデバイスのリダイレクトなしでネットワーク資源に接続します。」とあったのでNULLにしていたのですが、”NULL”ではなくて”NULL文字列”のことだったんですね・・・。
上記修正でWNetAddConnectionはきちんと動作するようになったのですが、ネットワークに接続していない場合、やはり関数が戻ってくるまで時間がかかってしまい(2~3秒くらい)、残念ながら当初の目的には合致しないようです・・・。WNetAddConnection2, 3 も試してみましたが、やはり判断に時間がかかってしまいます。
何かいい手段はないものでしょうか?
あらら、数秒もNGですか。
では、Pingを打ってみてはどうでしょう?
UDPなのでリトライ無しと言う訳にはいきませんが、小さいネットワーク内で
利用するならタイムアウト値を小さくすれば何とかなると思います。
私は試した事が無いのですが、過去の掲示板に記載が有りました。
(ABのバージョンが違うので少し手直しが必要だと思います。)
では、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()
以上です。