Usando ping em c #


87

Quando faço ping em um sistema remoto com Windows, ele diz que não há resposta, mas quando faço ping com c #, diz sucesso. O Windows está correto, o dispositivo não está conectado. Por que meu código consegue fazer ping com êxito quando o Windows não consegue?

Aqui está o meu código:

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
Verifique o seguinte exemplo postado na parte inferior desta página quando você clica no link do MSDN msdn.microsoft.com/en-us/library/… ou stackoverflow.com/questions/1281176/…
MethodMan

8
Você deve comparar PR.Status com IPStatus.Success. A comparação de strings não é a ferramenta correta neste caso.
Sam Axe

Depois de executar o seu ping, quais são os valores de algumas das propriedades PingReply, (como PR.Address, PR.RoundtripTime, PR.reply.Buffer.Length, e PR.Options.Ttl)? Além disso, você tem certeza de que possui o endereço IP correto em seu código, e não um endereço IP de teste?
Jon Senchyna

Jon Senchyna: Eu não os configurei e sim, tenho certeza que meu IP está correto.
Black Star

No meu caso, se "habilitar o processo de hospedagem do visual studio" (localização == >> projeto-> propriedade-> depuração) desabilitado, o método ping pode não funcionar. tente por favor!
steve

Respostas:


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 você se esqueceu de ";" no final da linha.
Sharpowski

8
Esta é uma resposta apenas em código . Acho que implementa uma comparação correta e mostra como lidar com possíveis exceções. Você poderia indicar por que este é o código correto em comparação com o código da pergunta?
Maarten Bodewes

7
Não sei quantas pessoas usaram esta resposta copiando e colando: / Faça pelo menos um using (var pinger = new Ping()) { .. }e os primeiros retornos são tão ruins?
Peter Schneider

2
Não faz sentido envolver a instância Ping com um using se try / catch / finally for empregado corretamente. É um ou outro, não ambos. Consulte stackoverflow.com/questions/278902/… .
JamieSee 01 de

3
@JamieSee Embora isso possa ser verdade, é mais limpo de usar using, e é o preferido neste caso.
Kelly Elton

38

O uso de ping em C # é obtido usando o método Ping.Send(System.Net.IPAddress), que executa uma solicitação de ping para o endereço IP ou URL fornecido (válido) e obtém uma resposta chamada de Pacote de protocolo de mensagem de controle da Internet (ICMP) . O pacote contém um cabeçalho de 20 bytes que contém os dados de resposta do servidor que recebeu a solicitação de ping. O System.Net.NetworkInformationnamespace da estrutura .Net contém uma classe chamada PingReplyque tem propriedades projetadas para traduzir a ICMPresposta e fornecer informações úteis sobre o servidor com ping, como:

  • IPStatus : obtém o endereço do host que envia a resposta de eco do Internet Control Message Protocol (ICMP).
  • IPAddress : obtém o número de milissegundos necessários para enviar uma solicitação de eco ICMP (Internet Control Message Protocol) e receber a mensagem de resposta de eco ICMP correspondente.
  • RoundtripTime (System.Int64) : obtém as opções usadas para transmitir a resposta a uma solicitação de eco do Internet Control Message Protocol (ICMP).
  • PingOptions (System.Byte []) : Obtém o buffer de dados recebidos em uma mensagem de resposta de eco do Internet Control Message Protocol (ICMP).

A seguir está um exemplo simples usado WinFormspara demonstrar como o ping funciona em c #. Ao fornecer um endereço IP válido textBox1e clicar button1, estamos criando uma instância da Pingclasse, uma variável local PingReplye uma string para armazenar o endereço IP ou URL. Atribuímos PingReplyao Sendmétodo ping e , em seguida, inspecionamos se a solicitação foi bem-sucedida, comparando o status da resposta ao IPAddress.Successstatus da propriedade . Por fim, extraímos PingReplyas informações que precisamos exibir para o usuário, que são descritas acima.

    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
Parabéns por incluir a referência de uso!
mattpm

1
Você não pode simplesmente escrever algumas linhas e explicar seu código? Couse isto não é útil para pessoas que querem entender este pedaço de código ...
Hille

4
Com certeza @Hille, escrevi esta resposta rapidamente alguns anos atrás, irei editar e adicionar uma descrição apropriada da resposta.
Ashraf Abusada

1

Importa System.Net.NetworkInformation

Função pública 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
Você não pode simplesmente escrever algumas linhas e explicar seu código? Couse isto não é útil para pessoas que querem entender este pedaço de código ...
Hille
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.