tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^3: インターネット
投稿日: 2009/02/14(Sat) 03:00
投稿者魔界の仮面弁士
> ところで魔界さん
…妙な略し方をしないでいただきたい。(--#


> 2つだけ質問していいですか?
それは何のための質問なのでしょうか?

ここはVB.NETの掲示板ですので、VBと直接関係の無い話題は
板違いでしょう。それに、全文引用も避けるべきかと。


> スクリプトエラーでオンライン検索ができない。
スクリプトエラーというのが、何の事を指しているのか分かりませんが、
オンライン検索ができずとも、オフラインでの調査は可能ですよね。

少なくとも先の第2案(tracert)については、ローカルヘルプでも
十分に情報が得られる範囲だと思いますし。


とりあえず、第3案の実装例を作ってみました。VB2008 用。
フォームに TextBox, Button, BackgroundWorker, ListBox を貼っておいてください。


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

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。