Wert wieder annehmen ausm DOS Modus in C

  • Themenstarter Themenstarter Watchme
  • Beginndatum Beginndatum
W

Watchme

Guest
Hi

Ich wollte mal ein programm in C schreiben, dass per "Ping" - Befehl verschiedene Server testet und danach deren mittlere Pingwerte auswertet....

gut.. soweit so schön...

per System "ping....................."
kann i9ch ganz fein den Ping befehl aufrufen, allerding fehlt mir völlig eine Idee, wie ich den Text, den der Befehl dann auspuckt in C weiter verarbeiten kann....

kann mir da einer helfen?

THX


WaTcHmE
 
Du könntest die Ausgabe von "ping" in eine Textdatei umleiten und diese dann einlesen.
 
Ich hatte Watcheme gestern im IRC schon vorgeschlagen, er solle sich den Code eines Ping-Programmes aus dem Internet suchen (zb. www.planet-source-code.com), diesen direkt ins Programm integrieren und die Rückgabewerte der Funktion so zu analysieren. Dadurch lernt man dann auch gleich etwas wirklich sinnvolles.
 
...was aber das problem nicht löst. ich meine es ist eigentlich nützlich ein problem schneller zu lösen indem man es umgeht *g* aber interessant wärs trotzdem mal wie sowas allgemein funktioniert. unter was könnte man da suchen? (google hilft nur wenn man nen suchbegriff hat ;) )
 
Tecs Idee hatte ich auch schon...ich weiss allerdings grade mal nicht wie ich .... allerdings..... das geht :)

Indi hat mir leider wenig weitergeholfen, da ich da keinen PING generator gefunden habe... (zumindest keinen verwertbaren)

ansonsten guck ich weiter, und bin für neue vorschläge und denkansätze dankbar
 
@Watchme

Hier mal etwas code...koennte man sozusagen als ICMP sniffer bezeichnen..
der lookt via RAW socket und schaut nach ICMP..wenn was kommt gibt er ein ppaar infos dazu aus...So haengt das Prog einfach in einer while Schleife..
gewrappt ist nix und wenn Du es beenden willst, dann bau noch ne abbruchbedingung ein...

Du kannst mit der Funktion icmp_typ noch mehr Typen abfragen..musst mal in den RFCs stoebern, da muessten die aufgelistet sein. Die kannst Du dann so wie bei den anderen (zb ICMP_ECHOREPLAY) einfach in den string schieben...

#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>

char *icmp_typ(unsigned short int type, char *back_f, int back_len)
{
switch(type)
{
case ICMP_ECHOREPLY : strncpy(back_f, "ICMP_ECHOREPLY", back_len); break;
case ICMP_DEST_UNREACH : strncpy(back_f, "ICMP_DEST_UNREACH", back_len); break;
case ICMP_SOURCE_QUENCH : strncpy(back_f, "ICMP_SOURCE_QUENCH", back_len); break;
case ICMP_ECHO : strncpy(back_f, "ICMP_ECHO", back_len); break;
default : strncpy(back_f, "unbekannt", back_len); break;
};
return back_f;
}

int main(int argc, char *argv[])
{
int sock, sum_bytes;
struct icmphdr *icmp; // icmp Struktur ist in ip_icmp.h beschrieben
struct iphdr *ip; // ip header
struct in_addr addr; // socket adress-struktur
char buffer[1024], back[32];

/* RAW socket anlegen ICM Protocol*/
sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

/* start des ip headers */
ip = (struct iphdr*) buffer;

/* start des ICMP headers */
icmp = ( (struct icmphdr*) (buffer + sizeof(struct iphdr)) );

/* gelesene bytes > 0 ? */
while ( (sum_bytes = recv(sock, buffer, sizeof(buffer), 0) ) > 0)
{
addr.s_addr = ip->saddr; //ip holen aus Antwort
printf("ICMP von %s , Laenge: %i Bytes TTL: %i ", inet_ntoa(addr), sum_bytes, ip->ttl);
printf(" Typ: %s \n", icmp_typ(icmp->type, back, sizeof(back)));
}
return(0);
}


ach ja..btw. ich hab keinen Plan ob das unter WIN laeuft :((
Wenn (du win hast) es laeuft poste mal bitte..:)


:wq!
 
hi .. kannst du ne kurze erklärung hinter die Zeilen setzen???

weil ich verstehs nit ganz ( auch wenn es hier leute gibt die jetzt aufstöhnen).
die Basics sind klar, aber ....................
 
Ich hab erst vor kurzem eine Ping-Funktion für Linux geschrieben. Sollte diese jemand brauchen kann er sich gerne mit mir in kontakt setzen.
Soll das Programm unter Windows laufen?
Eine Alternative wäre doch die Funktion pipe(). Leider weiß ich aber nicht ob es diese oder etwas ähnliches für Windows gibt.
 
Wenn man pipe() verwenden wollte muesste man eh die ping funktion im programm haben, wobei dann eine pipe wiederrum ueberfluessig waere.

Imo sind pipes *nix bezogen.

:wq!
 
"Stimmt nicht."...

Der Umkehrschluss ist, dasz wenn Du das Programm ping laufen hast ist es ueberfluessig die ausgabe irgend-wo-hin zu leiten, da man den code ^
zum auslesen der Antworten benutzen kann...so war das zumindest gemeint ;)

:wq!
 
Zurück
Oben