Hallo,
hier im Forum gibt es oft die Frage…“Woher weiß ich ob ich Rechner XY erreichen kann“
Oder wie kann ich aus C# pingen?
Geht villeicht auch anders oder eleganter… X( ich habs so gelöst.
public void IsOnline(ref bool online,string targetadress)
{
int ExitCode = -1;
System.Diagnostics.Process Process = new System.Diagnostics.Process();
Process.StartInfo.UseShellExecute = false;
Process.StartInfo.CreateNoWindow = true;
Process.StartInfo.RedirectStandardOutput = true;
Process.StartInfo.FileName = "ping.exe";
Process.StartInfo.Arguments = @targetadress;
Process.Start();
Process.WaitForExit();
ExitCode = Process.ExitCode;
if (ExitCode == 0)
{
online = true;
}
else
{
online = false;
}
}
Gruß
Chaossurfer
siehe System.Net.NetworkInformation.Ping
ab .Net 2.0 ...
Hallo,
da ich kein .NET 2.0 am laufen habe... was machen die da?
Danke schonmal.
cs
>da ich kein .NET 2.0 am laufen habe... was machen die da?
Die Benutzen ICMP.
Guter Begriff zum Googlen.
Das ' "net 1.1" ping ' ist auch Problem von anderen Sprachen.
Meine letzte impl. war in C++ (vc6).
Ist der Ping ein Problem - oder die API(Win)?
Es gibt halt schon Unterschiede(in C# gibt halt keine direkten Calls, da ist C# wie VB5 auf Schnittstellen angewiesen).
Es geht auch über die Socket-Klasse, wenn's nur darum geht festzustellen, ob ein Rechner da ist...
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
wenn du nen computer pingen willst mach das am besten so:
using System;
using System.Net;
using System.Net.Sockets;
public class Pinger {
public static int GetPingTime(string host) {
int dwStart = 0, dwStop = 0;
// Einen Raw-Socket erstellen.
Socket socket = new Socket(AddressFamily.InterNetwork,
SocketType.Raw, ProtocolType.Icmp);
// Den IPEndPoint des Servers in einen EndPoint konvertieren.
IPHostEntry serverHE = Dns.GetHostByName(host);
IPEndPoint ipepServer = new IPEndPoint(serverHE.AddressList[0], 0);
EndPoint epServer = (ipepServer);
// Den empfangenen Endpunkt für den Client-Rechner setzen.
IPHostEntry fromHE = Dns.GetHostByName(Dns.GetHostName());
IPEndPoint ipEndPointFrom = new IPEndPoint(fromHE.AddressList[0], 0);
EndPoint EndPointFrom = (ipEndPointFrom);
// Das zu sendende Paket erstellen.
int PacketSize = 0;
IcmpPacket packet = new IcmpPacket();
for (int j = 0; j < 1; j++) {
packet.Type = ICMP_ECHO;
packet.SubCode = 0;
packet.CheckSum = UInt16.Parse("0");
packet.Identifier = UInt16.Parse("45");
packet.SequenceNumber = UInt16.Parse("0");
int PingData = 32;
packet.Data = new Byte[PingData];
for (int i = 0; i < PingData; i++)
packet.Data[i] = (byte)'#';
PacketSize = PingData + 8;
Byte [] icmp_pkt_buffer = new Byte [PacketSize];
int index = 0;
index = Serialize(packet, icmp_pkt_buffer, PacketSize, PingData);
// Die Prüfsumme für das Paket berechnen.
double double_length = Convert.ToDouble(index);
double dtemp = Math.Ceiling(double_length / 2);
int cksum_buffer_length = Convert.ToInt32(dtemp);
UInt16[] cksum_buffer = new UInt16[cksum_buffer_length];
int icmp_header_buffer_index = 0;
for (int i = 0; i < cksum_buffer_length; i++) {
cksum_buffer[i] = BitConverter.ToUInt16(icmp_pkt_buffer,
icmp_header_buffer_index);
icmp_header_buffer_index += 2;
}
UInt16 u_cksum = checksum(cksum_buffer, cksum_buffer_length);
packet.CheckSum = u_cksum;
// Nachdem nun die Prüfsumme vorhanden ist, das Paket erneut serialisieren.
byte[] sendbuf = new byte[PacketSize];
index = Serialize(packet, sendbuf, PacketSize, PingData);
// Stoppen der Zeit starten.
dwStart = System.Environment.TickCount;
socket.SendTo(sendbuf, PacketSize, 0, epServer);
// Antwort empfangen und das Stoppen der Zeit beenden.
byte[] ReceiveBuffer = new byte[256];
socket.ReceiveFrom(ReceiveBuffer, 256, 0, ref EndPointFrom);
dwStop = System.Environment.TickCount - dwStart;
}
// Bereinigung und Rückgabe der berechneten Ping-Zeit in Sekunden.
socket.Close();
return (int)dwStop;
}
private static int Serialize(IcmpPacket packet, byte[] buffer,
int packetSize, int pingData) {
// (Private Methode zur Serialisierung des Pakets ist nicht aufgeführt.)
}
private static UInt16 checksum(UInt16[] buffer, int size) {
// (Private Methode zur Berechnung der Prüfsumme ist nicht aufgeführt.)
}
}
public class IcmpPacket {
public byte Type; // Nachrichtentyp
public byte SubCode; // Subcodetyp(auch untercode genannt)
public UInt16 CheckSum; // Einerkomplement-Prüfsumme für Struktur
public UInt16 Identifier; // Bezeichner
public UInt16 SequenceNumber; // Sequenznummer
public byte[] Data;
}
wenn du die Methoden Serialize und checksum jetzt noch implementierst ?
Fuer ganz pfifige kann man ja auch im DOS ping meinserverbzwrechenerdenicherreichenmoechte eingeben z.B ping zockerbande.net