C #에서 ping 사용


88

Windows가있는 원격 시스템을 Ping하면 응답이 없다고 표시되지만 C #으로 Ping하면 성공이라고 표시됩니다. Windows가 정확하고 장치가 연결되어 있지 않습니다. Windows가 아닌데도 내 코드가 성공적으로 핑할 수있는 이유는 무엇입니까?

내 코드는 다음과 같습니다.

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");
}


8
PR.Status를 IPStatus.Success와 비교해야합니다. 이 경우 문자열 비교는 올바른 도구가 아닙니다.
Sam Ax

당신이 당신의 핑을 수행 한 후 PingReply의 속성 중 일부의 값은 무엇인가, (같은 PR.Address, PR.RoundtripTime, PR.reply.Buffer.Length,과 PR.Options.Ttl)? 또한 코드에 테스트 IP 주소가 아닌 올바른 IP 주소가 있는지 확인합니까?
Jon Senchyna

Jon Senchyna : 설정하지 않았습니다. 네, 제 IP가 정확하다고 확신합니다.
Black Star

제 경우에는 "비주얼 스튜디오 호스팅 프로세스 활성화"(위치 == >> project-> property-> debug)가 비활성화 된 경우 ping 메서드가 작동하지 않을 수 있습니다. 시도하십시오!
steve jul

답변:


219
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

9
이것은 코드 전용 답변 입니다. 올바른 비교를 구현하고 가능한 예외를 처리하는 방법을 보여줍니다. 질문의 코드와 비교하여 이것이 올바른 코드 인 이유 를 나타낼 수 있습니까?
Maarten Bodewes

7
얼마나 많은 사람들이이 답변을 복사하여 붙여 넣기로 사용했는지 모르겠습니다. : / 적어도 a를 수행 using (var pinger = new Ping()) { .. }하고 조기 반품이 그렇게 사악합니까?
Peter Schneider

2
try / catch / finally가 적절하게 사용되면 using으로 Ping 인스턴스를 래핑 할 필요가 없습니다. 둘 다가 아닙니다. stackoverflow.com/questions/278902/…를 참조하십시오 .
JamieSee

3
@JamieSee 사실 일 수 있지만 using대신 사용하는 것이 더 깨끗하며이 경우 선호됩니다.
Kelly Elton

40

C #에서 ping을 사용 Ping.Send(System.Net.IPAddress)하려면 제공된 (유효한) IP 주소 또는 URL에 대한 ping 요청을 실행하고 ICMP (Internet Control Message Protocol) 패킷 이라는 응답을받는 메서드를 사용합니다 . 패킷에는 ping 요청을 수신 한 서버의 응답 데이터가 포함 된 20 바이트 헤더가 포함되어 있습니다. .Net 프레임 워크 System.Net.NetworkInformation네임 스페이스에는 응답 PingReply을 번역하고 ICMP다음과 같이 핑된 서버에 대한 유용한 정보를 제공 하도록 설계된 속성이있는 라는 클래스가 포함되어 있습니다 .

  • IPStatus : ICMP (Internet Control Message Protocol) 에코 응답을 보내는 호스트의 주소를 가져옵니다.
  • IPAddress : ICMP (Internet Control Message Protocol) 에코 요청을 보내고 해당 ICMP 에코 응답 메시지를받는 데 걸리는 시간 (밀리 초)을 가져옵니다.
  • RoundtripTime (System.Int64) : ICMP (Internet Control Message Protocol) 에코 요청에 대한 응답을 전송하는 데 사용되는 옵션을 가져옵니다.
  • PingOptions (System.Byte []) : ICMP (Internet Control Message Protocol) 에코 응답 메시지에서 수신 한 데이터의 버퍼를 가져옵니다.

다음은 WinFormsC #에서 ping이 작동하는 방식을 보여주기 위해 사용하는 간단한 예제 입니다. 에 유효한 IP 주소를 제공 textBox1하고를 클릭 button1하여 Ping클래스 의 인스턴스 , 로컬 변수 PingReply및 IP 또는 URL 주소를 저장할 문자열을 만듭니다. PingReplyping Send메서드에 할당 한 다음 응답 상태를 속성 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

1
몇 줄만 작성하고 코드를 설명 할 수 없습니까? 이 나오긴 ...이 코드 조각을 이해하기 원하는 사람들을위한 유용하지 않습니다
Hille의

4
물론 @Hille, 몇 년 전에이 답변을 빠르게 작성했으며 답변에 대한 적절한 설명을 편집하고 추가합니다.
Ashraf Abusada

2

System.Net.NetworkInformation을 가져옵니다.

Public Function 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

-8
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의

원래 제시된 코드는 전혀 DRY아닙니다 .
greybeard
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.