Reputation: 1291
When I Ping a remote system with Windows it says there is no reply, but when I ping with c# it says success. Windows is correct, the device is not connected. Why is my code able to successfully ping when Windows is not?
Here is my code :
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");
}
Upvotes: 128
Views: 310144
Reputation: 13010
using System.Net.NetworkInformation;
public static bool PingHost(string nameOrAddress)
{
try
{
using (Ping pinger = new Ping())
{
PingReply reply = pinger.Send(nameOrAddress);
return reply.Status == IPStatus.Success;
}
}
catch (PingException)
{
return false;
}
}
Upvotes: 281
Reputation: 2994
Here is the async
and more compact version using the Ping.SendPingAsync()
method:
using System.Net.NetworkInformation;
using System.Threading.Tasks;
public static async Task<bool> SendPing(string hostNameOrAddress)
{
using (var ping = new Ping())
{
try
{
PingReply result = await ping.SendPingAsync(hostNameOrAddress);
return result.Status == IPStatus.Success;
}
catch
{
return false;
}
}
}
Sample usage:
bool result1 = await SendPing("127.0.0.1"); // true
bool result2 = await SendPing("non-existent-host"); // false
Upvotes: 2
Reputation: 17
This solution implements a much less flexible method for pinging a source - not recommended in the modern paradigm of C#. At one time, IIRC, there was not a
Ping(...)
method.
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();
}
Upvotes: -14
Reputation: 6638
private async void Ping_Click(object sender, RoutedEventArgs e)
{
Ping pingSender = new Ping();
string host = @"stackoverflow.com";
await Task.Run(() =>{
PingReply reply = pingSender.Send(host);
if (reply.Status == IPStatus.Success)
{
Console.WriteLine("Address: {0}", reply.Address.ToString());
Console.WriteLine("RoundTrip time: {0}", reply.RoundtripTime);
Console.WriteLine("Time to live: {0}", reply.Options.Ttl);
Console.WriteLine("Don't fragment: {0}", reply.Options.DontFragment);
Console.WriteLine("Buffer size: {0}", reply.Buffer.Length);
}
else
{
Console.WriteLine("Address: {0}", reply.Status);
}
});
}
Upvotes: 1
Reputation: 19
Imports 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
Upvotes: -3
Reputation: 4895
Using ping in C# is achieved by using the method Ping.Send(System.Net.IPAddress)
, which runs a ping request to the provided (valid) IP address or URL and gets a response which is called an Internet Control Message Protocol (ICMP) Packet. The packet contains a header of 20 bytes which contains the response data from the server which received the ping request. The .Net framework System.Net.NetworkInformation
namespace contains a class called PingReply
that has properties designed to translate the ICMP
response and deliver useful information about the pinged server such as:
The following is a simple example using WinForms
to demonstrate how ping works in c#. By providing a valid IP address in textBox1
and clicking button1
, we are creating an instance of the Ping
class, a local variable PingReply
, and a string to store the IP or URL address. We assign PingReply
to the ping Send
method, then we inspect if the request was successful by comparing the status of the reply to the property IPAddress.Success
status. Finally, we extract from PingReply
the information we need to display for the user, which is described above.
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!!");
}
}
}
}
Upvotes: 54