C#でpingを使用する


88

Windowsを使用してリモートシステムにpingを実行すると、応答がないと表示されますが、c#を使用してpingを実行すると、成功と表示されます。Windowsは正しく、デバイスは接続されていません。Windowsが正常にpingできないのに、コードが正常にpingできるのはなぜですか?

これが私のコードです:

Ping p1 = new Ping();
PingReply PR = p1.Send("192.168.2.18");
// check when the ping is not success
while (!PR.Status.ToString().Equals("Success"))
{
    Console.WriteLine(PR.Status.ToString());
    PR = p1.Send("192.168.2.18");
}
// check after the ping is n success
while (PR.Status.ToString().Equals("Success"))
{
    Console.WriteLine(PR.Status.ToString());
    PR = p1.Send("192.168.2.18");
}

4
次の例をチェックアウトあなたはMSDNのリンクをクリックするとこのページの下部に掲載msdn.microsoft.com/en-us/library/... または stackoverflow.com/questions/1281176/...
メソッド・マン

8
PR.StatusをIPStatus.Successと比較する必要があります。この場合、文字列の比較は正しいツールではありません。
サムアックス

あなたのpingを実行した後、PingReplyのプロパティの一部の値が何であるか、(のようなPR.AddressPR.RoundtripTimePR.reply.Buffer.Length、及びPR.Options.Ttl)?また、テストIPアドレスではなく、コードに正しいIPアドレスが含まれていることを確認しますか?
Jon Senchyna 2012

Jon Senchyna:私はそれらを設定していません、そしてはい、私のIPは正しいと確信しています。
ブラックスター

私の場合、「Visual Studioホスティングプロセスを有効にする」(場所は== >>プロジェクト->プロパティ->デバッグ)が無効になっていると、pingメソッドが機能しない可能性があります。してみてください!
スティーブ2016

回答:


216
using System.Net.NetworkInformation;    

public static bool PingHost(string nameOrAddress)
{
    bool pingable = false;
    Ping pinger = null;

    try
    {
        pinger = new Ping();
        PingReply reply = pinger.Send(nameOrAddress);
        pingable = reply.Status == IPStatus.Success;
    }
    catch (PingException)
    {
        // Discard PingExceptions and return false;
    }
    finally
    {
        if (pinger != null)
        {
            pinger.Dispose();
        }
    }

    return pingable;
}

1
@JamieSeeあなたは ";"を忘れました 行の終わりに。
Sharpowski 2018

8
これはコードのみの回答です。正しい比較を実装し、考えられる例外を処理する方法を示していると思います。質問のコードと比較して、これが正しいコードである理由を教えてください。
Maarten Bodewes 2018年

7
コピーアンドペーストでこの回答を使用した人の数がわかりません:/少なくともausing (var pinger = new Ping()) { .. }を実行し、早期の返品は非常に邪悪ですか?
ピーターシュナイダー

2
try / catch / finallyが適切に使用されている場合、Pingインスタンスをusingでラップしても意味がありません。どちらか一方であり、両方ではありません。stackoverflow.com/questions/278902/…を参照してください。
JamieSee

3
@JamieSeeそれは本当かもしれませんが、using代わりに使用する方がクリーンであり、この場合は推奨されます。
ケリーエルトン

40

C#でpingを使用Ping.Send(System.Net.IPAddress)するには、指定された(有効な)IPアドレスまたはURLに対してping要求を実行し、インターネット制御メッセージプロトコル(ICMP)パケットと呼ばれる応答を取得するメソッドを使用します。パケットには、ping要求を受信したサーバーからの応答データを含む20バイトのヘッダーが含まれています。.Net FrameworkSystem.Net.NetworkInformation名前空間にはPingReplyICMP応答を変換し、次のようなpingされたサーバーに関する有用な情報を提供するように設計されたプロパティを持つというクラスが含まれています。

  • IPStatus:インターネット制御メッセージプロトコル(ICMP)エコー応答を送信するホストのアドレスを取得します。
  • IPAddress:インターネット制御メッセージプロトコル(ICMP)エコー要求を送信し、対応するICMPエコー応答メッセージを受信するのにかかるミリ秒数を取得します。
  • RoundtripTime (System.Int64):インターネット制御メッセージプロトコル(ICMP)エコー要求への応答の送信に使用されるオプションを取得します。
  • PingOptions (System.Byte []):インターネット制御メッセージプロトコル(ICMP)エコー応答メッセージで受信したデータのバッファーを取得します。

以下は、WinFormsC#でpingがどのように機能するかを示すために使用する簡単な例です。に有効なIPアドレスを指定してtextBox1をクリックするbutton1と、Pingクラスのインスタンス、ローカル変数PingReply、およびIPアドレスまたはURLアドレスを格納するための文字列が作成されます。PingReplypingSendメソッドに割り当て、応答のステータスとプロパティのIPAddress.Successステータスを比較して、リクエストが成功したかどうかを調べます。最後に、PingReply上記のユーザーに表示する必要のある情報から抽出します。

    using System;
    using System.Net.NetworkInformation;
    using System.Windows.Forms;

    namespace PingTest1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                Ping p = new Ping();
                PingReply r;
                string s;
                s = textBox1.Text;
                r = p.Send(s);

                if (r.Status == IPStatus.Success)
                {
                    lblResult.Text = "Ping to " + s.ToString() + "[" + r.Address.ToString() + "]" + " Successful"
                       + " Response delay = " + r.RoundtripTime.ToString() + " ms" + "\n";
                }
            }

            private void textBox1_Validated(object sender, EventArgs e)
            {
                if (string.IsNullOrWhiteSpace(textBox1.Text) || textBox1.Text == "")
                {
                    MessageBox.Show("Please use valid IP or web address!!");
                }
            }
        }
    }

10
使用リファレンスを含めてくれてありがとう!
mattpm 2016年

1
数行書いてコードを説明するだけではいけませんか?これは、このコードを理解したい人には役に立たないからです...
Hille

4
確かに@Hille、私は数年前にこの回答をすばやく書きました。回答の適切な説明を編集して追加します。
Ashraf Abusada 2018年

2

System.Net.NetworkInformationをインポートします

パブリック関数PingHost(ByVal nameOrAddress As String)As Boolean Dim pingable As Boolean = False Dim pinger As Ping Dim lPingReply As PingReply

    Try
        pinger = New Ping()
        lPingReply = pinger.Send(nameOrAddress)
        MessageBox.Show(lPingReply.Status)
        If lPingReply.Status = IPStatus.Success Then

            pingable = True
        Else
            pingable = False
        End If


    Catch PingException As Exception
        pingable = False
    End Try
    Return pingable
End Function

-9
private void button26_Click(object sender, EventArgs e)
{
    System.Diagnostics.ProcessStartInfo proc = new System.Diagnostics.ProcessStartInfo();
    proc.FileName = @"C:\windows\system32\cmd.exe";
    proc.Arguments = "/c ping -t " + tx1.Text + " ";
    System.Diagnostics.Process.Start(proc);
    tx1.Focus();
}

private void button27_Click(object sender, EventArgs e)
{
    System.Diagnostics.ProcessStartInfo proc = new System.Diagnostics.ProcessStartInfo();
    proc.FileName = @"C:\windows\system32\cmd.exe";
    proc.Arguments = "/c ping  " + tx2.Text + " ";
    System.Diagnostics.Process.Start(proc);
    tx2.Focus();
}

3
数行書いてコードを説明するだけではいけませんか?これは、このコードを理解したい人には役に立たないからです...
Hille
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.