tagCANDY CGI VBレスキュー(花ちゃん) - VBレスキュー(花ちゃん)の投稿サンプル用掲示板 - Visual Basic 6.0 VB2005 VB2010
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ
VBレスキュー(花ちゃん)の投稿サンプル用掲示板
     サンプル投稿用掲示板  VB2005 〜 用トップページ  VB6.0 用 トップページ
ネットワーク接続経路の追跡調査・取得(VB.NET) ( No.0 )  [親スレッドへ]
日時: 2009/04/15 09:19
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[通信][インターネット][]                                            *
* キーワード:接続ルート,逆探知,プロバイダ,追跡,,                                 *
***********************************************************************************
タイトル : インターネット
記 事 No : 8720
投 稿 日 : 2009/02/12(Thu) 00:23
元質問者 : レオ♪  

VisualBasic2008で接続ルートを逆探知するプログラムはつくれますか?
例えば
NTT⇒プロバイダー(ソニー)⇒最終接続先
みたいな感じで。

-----------------------------------------------------------------------------------
記事No : 8727
投稿日 : 2009/02/14(Sat) 03:00
回答者 : 魔界の仮面弁士  
-----------------------------------------------------------------------------------
とりあえず、第3案の実装例を作ってみました。VB2008 用。
フォームに TextBox, Button, BackgroundWorker, ListBox を貼っておいてください。


Option Strict Off    'エラーが表示されるようなら取り敢えずこれで --By 花ちゃん --
Imports System.ComponentModel
Imports System.Net
Imports System.Net.NetworkInformation
Public Class Form1
    Private Sub Form1_Load() Handles MyBase.Load
        TextBox1.Text = "www.google.co.jp"
        Button1.Text = "経路追跡"
        BackgroundWorker1.WorkerReportsProgress = True
    End Sub

    Private Sub Button1_Click() Handles Button1.Click
        Button1.Enabled = False
        ListBox1.Items.Clear()
        BackgroundWorker1.RunWorkerAsync(TextBox1.Text)
    End Sub

    Private Sub BackgroundWorker1_ProgressChanged(ByVal bgw As BackgroundWorker, _
        ByVal e As ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
        ListBox1.Items.Add(e.UserState.ToString())
    End Sub

    Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal bgw As BackgroundWorker, _
        ByVal e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        Button1.Enabled = True
    End Sub

    Private Sub BackgroundWorker1_DoWork(ByVal bgw As BackgroundWorker, _
                        ByVal e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Dim target As String = e.Argument.ToString()
        Dim msg As String

        Dim targetIP As IPAddress = Nothing
        Dim targetName As String
        If IPAddress.TryParse(target, targetIP) Then
            Dim host As IPHostEntry = Dns.GetHostEntry(targetIP)
            targetName = Nothing
        Else
            Dim host As IPHostEntry = Dns.GetHostEntry(target)
            targetName = host.HostName
            If host.AddressList.Length > 0 Then
                targetIP = host.AddressList(0)
            Else
                targetIP = IPAddress.None
            End If
        End If

        msg = targetIP.ToString()
        If targetName IsNot Nothing Then
            msg = targetName & "[" & msg & "]"
        End If
        bgw.ReportProgress(0, msg & " への経路を追跡しています。")

        Using pinger As New Ping()
            Dim maxHops As Integer = 30     '最大30経路まで追跡する
            Dim timeout As Integer = 3000   '3秒応答が無ければスキップ

            Dim timeToLive As Integer = 1
            Dim finished As Boolean = False
            Dim emptyBinary() As Byte = {}
            Do
                Dim reply As PingReply
                reply = pinger.Send(targetIP, timeout, emptyBinary, _
                                           New PingOptions(timeToLive, True))

                msg = String.Format("{0, 3}", timeToLive)
                timeToLive += 1

                Dim replyAddress As IPAddress = reply.Address
                If reply.Status = IPStatus.Success Then
                    finished = True
                ElseIf reply.Status = IPStatus.TimedOut Then
                    bgw.ReportProgress(0, msg & ": 要求がタイムアウトしました。")
                    Continue Do
                End If
                bgw.ReportProgress(0, msg & ": " & replyAddress.ToString())
            Loop Until finished OrElse timeToLive > maxHops

            If finished Then
                msg = "経路の追跡が完了しました。"
            Else
                msg = String.Format("ホップ数が {0} を超えたため中止しました。", maxHops)
            End If
            bgw.ReportProgress(100, msg)
        End Using
    End Sub
End Class

上記実行結果の画像(質問者は30経路を超えたそうですが私の場合は...。)



 [スレッド一覧へ] [親スレッドへ]