Auf Ergebnis eines Pings reagieren

Post Reply
Message
Author
Peter

Auf Ergebnis eines Pings reagieren

#1 Post by Peter »

Hi,

ich möchte ein C++ Proggie schreiben, dass unterschiedlich reagiert, je nachdem ob ein ping fuktioniert in einer bestimmten Zeit. Logisch soll das so aussehten


int flag;
while(true)
{
if(_Ping_(192.168.0.99) == true)
flag = 1;
else
flag = 0;
...
}

Wie mache ich das nun, dass ich merke ob der Ping beantwortet wird ?

User avatar
hjb
Pro-Linux
Posts: 3264
Joined: 15. Aug 1999 16:59
Location: Bruchsal
Contact:

Re: Auf Ergebnis eines Pings reagieren

#2 Post by hjb »

Hi,

if (system("ping -w 1 -c1 192.168.0.99 > /dev/null 2>&1") == 0)
flag = 1;
else
flag = 0;

Gruß,
hjb
Pro-Linux - warum durch Fenster steigen, wenn es eine Tür gibt?

Peter

Re: Auf Ergebnis eines Pings reagieren

#3 Post by Peter »

Nur um das Genze auch zu verstehen, warum schreibst Du 2>&1 am Ende, was macht dass ? Ich nehme mal an dass das testen auf Null sowas wie EXIT_SUCCESS vom ping programm ist.

Ach ja:
Ich habe deinen Vorschlag gleich mal in einem kleinem Programm getestet, es funzt auch, nur bekomme ich am Ende noch einen Segmentation Fault, den ich mir nicht wirklich erklären kann, vielleicht kann ja jemand helfen.

testping.cpp:
#include <iostream.h>
#include <string.h>
#include <stdlib.h>

int main(int argc,char *argv[])
{
if(argc != 2)
{
cout << "Rufen sie das Programm mit einer IP als Option auf" << endl;
exit(-1);
}
char string[35];
strcpy(string, "ping -w1 -c1 ");
strcat(string, argv<font size="1">);
strcat(string, " > /dev/null 2>&1");
cout << string << endl;

if(system(string) == 0)
cout << "Der Rechner ist up" << endl;
else
cout << "Der Rechner ist down" << endl;
}


Kompiliert mit "g++ testping"
pwk@pwk:~ > a.out 192.168.0.25
ping -w1 -c1 192.168.0.25 > /dev/null 2>&1
Der Rechner ist up
Segmentation fault

Ach ja: Ohne das von mir nicht verstandenen 2>&1 gibt es keinen Seg Fault

Sebastian Ude

Re: Auf Ergebnis eines Pings reagieren

#4 Post by Sebastian Ude »

@ Peter

Mit dem

> /dev/null 2>&1

bewirkt hjb, dass die Standardfehlerausgabe (2) auf die Standardausgabe (1) und diese wiederum auf /dev/null umgeleitet wird.

Ansonsten würde der User an der entsprechenden Stelle im Programm die Ausgaben des ping-Programmes sehen, was wahrscheinlich nicht erwünscht ist.


Zu dem Segfault:

Das string-Array ist maßlos unterdimensioniert !
Bei dir wäre der String ab dieser Stelle:

strcat(string, " > /dev/null 2>&1");

Schon 41 Zeichen lang - das Nullzeichen am Ende mal nicht mit eingerechnet !

Also, vergrößere das string-Array - oder, da wir sowieso in C++ arbeiten, realisiere die Geschichte mit der string-Klasse:

<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#include <iostream.h>
#include <string>
#include <stdlib.h>

int main(int argc,char *argv[])
{
string cmd;

if(argc != 2)
{
cout << "Rufen sie das Programm mit einer IP als Option auf" << endl;
exit(-1);
}

cmd = "ping -w1 -c1 ";

/* ACHTUNG ! */
/* Um die 1 sollten eckige Klammern stehen ... *grummel* @ Board */

cmd += argv(1);
cmd += " > /dev/null 2>&1";

cout << cmd << endl;

if(system(cmd.c_str()) == 0)
cout << "Der Rechner ist up" << endl;
else
cout << "Der Rechner ist down" << endl;
}
</font><hr></pre></blockquote>

Das ist bequemer und sicherer.

SELLMI

Re: Auf Ergebnis eines Pings reagieren

#5 Post by SELLMI »

wieso habe ich die file iostream.h nicht ? woher bekomme ich die ?

Jens Lansing

Re: Auf Ergebnis eines Pings reagieren

#6 Post by Jens Lansing »

Installier die C++ Header (bzw include) Dateien.

Post Reply