Laden...

Ping

Erstellt von chaossurfer vor 18 Jahren Letzter Beitrag vor 16 Jahren 10.588 Views
C
chaossurfer Themenstarter:in
156 Beiträge seit 2004
vor 18 Jahren
Ping

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

M
1.439 Beiträge seit 2005
vor 18 Jahren

siehe System.Net.NetworkInformation.Ping
ab .Net 2.0 ...

C
chaossurfer Themenstarter:in
156 Beiträge seit 2004
vor 18 Jahren

Hallo,

da ich kein .NET 2.0 am laufen habe... was machen die da?

Danke schonmal.

cs

N
4.644 Beiträge seit 2004
vor 18 Jahren
I
1.739 Beiträge seit 2005
vor 17 Jahren

>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).

2.921 Beiträge seit 2005
vor 17 Jahren

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.

B
108 Beiträge seit 2006
vor 17 Jahren

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;
}
1
1 Beiträge seit 2006
vor 17 Jahren

wenn du die Methoden Serialize und checksum jetzt noch implementierst ?

X
92 Beiträge seit 2007
vor 16 Jahren

Fuer ganz pfifige kann man ja auch im DOS ping meinserverbzwrechenerdenicherreichenmoechte eingeben z.B ping zockerbande.net