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 ?
Auf Ergebnis eines Pings reagieren
Re: Auf Ergebnis eines Pings reagieren
Hi,
if (system("ping -w 1 -c1 192.168.0.99 > /dev/null 2>&1") == 0)
flag = 1;
else
flag = 0;
Gruß,
hjb
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?
Re: Auf Ergebnis eines Pings reagieren
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
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
Re: Auf Ergebnis eines Pings reagieren
@ 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.
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.
Re: Auf Ergebnis eines Pings reagieren
wieso habe ich die file iostream.h nicht ? woher bekomme ich die ?
Re: Auf Ergebnis eines Pings reagieren
Installier die C++ Header (bzw include) Dateien.