c++ IPs anpingen

Hallöchen Leuts ,
ich möchte für ein Schulprojekt alle IPs im Netzwerk anpingen und an die , wo ich was zurück bekommen , eine Datei schicken.
Also ich hatte es mir so in der Art vorgestellt :
Code:
for(int i = 0;i < 256;i++){
system("ping 192.168.2." + i);
}
Natürlich funktioniert das nicht. Also kann mir jemand sagen , wie ich die IPs anpinge und eine Antwort zurück bekomme? Google spuckt mir nur zu komplizierte Sachen aus :(

gz RiG
 
Code:
bitmuncher@mbp2:~> cat testping.pl
#!/usr/bin/env perl

for($i = 0; $i < 256; $i++){
  system("ping -c 1 192.168.2.".$i);
}

Geht doch.

Code:
bitmuncher@mbp2:~> perl testping.pl
PING 192.168.2.0 (192.168.2.0): 56 data bytes

--- 192.168.2.0 ping statistics ---
1 packets transmitted, 0 packets received, 100.0% packet loss
PING 192.168.2.1 (192.168.2.1): 56 data bytes

--- 192.168.2.1 ping statistics ---
1 packets transmitted, 0 packets received, 100.0% packet loss
PING 192.168.2.2 (192.168.2.2): 56 data bytes

...
 
ähmm... Jaa ... :D
Ich habe glaube ich vergessen zu sagen , dass ich ein C++-Newb bin :(
Könntest du mir evtl. sagen was das '$' vor dem i bedeutet ?
Und was ist das für ne Zeile "#!/usr/bin/env perl" ?
Kann ich die Antwort auch in eine if-else Verzweigung packen ?
also
Code:
if(system("ping -c 1 192.168.2.".$i)){
system("copy 192.168.2.".$i test.exe);
}
 
Die Frage ist, ob du das in C++ machen musst, oder ob eine andere Sprache geht. Dein Ansatz aus deinem Eingangsbeitrag funktioniert nur in Skriptsprachen vernünftig, weswegen ich das einfach mal in Perl umgesetzt habe.

In C++ muss der Kram noch in die main() gepackt werden. Ausserdem arbeitest du mit verschiedenen Datentypen (Char-Array und Integer), die du unter einen Hut bekommen musst, wofür sich z.B. sprintf() anbietet. Schliesslich will ja system() ein 'char *' als Parameter und i ist nunmal kein char sondern ein int.

Code:
#achtung: lazy code!!!

#include <cstdlib>
#include <iostream>
using namespace std;

int main() {
  int i;
  char *cmd;
  char basecmd[20] = "ping 192.168.2.";

  for(i = 0; i < 256; i++){
    sprintf(cmd, "%s%d", basecmd, i);
    system(cmd);
  }
}

Edit: Btw hab ich von C++ auch kaum Ahnung und nur grundlegend von C, da ich es seit Jahren nicht mehr verwendet hab.
 
Jo Danke ... :D
ALso ich finde C++ recht einfach und es ist mir zu viel Zeitaufwand in einer Woche noch eine 3.Sprache zu lernen...
Ich habe grade diesen Quellcode versucht:
Code:
do{
		system("ping -c 192.168.2." + i);
		i++;
	} while (i < 256);
Und was dabei rausgekommen ist , ist folgendes :

6LuXXGT.png


Was zum Henker geht da ab? o.O

gz RiG
 
So oder so wirst du mit system() das Problem haben, dass du den Output nicht bekommst, wenn du nicht STDOUT komplett abfängst, was unsinnig wäre. system() lässt den Prozess allein und gibt dir lediglich den Exit-Code des aufgerufenen Programms wieder. Wesentlich logischer wäre es einen Socket aufzubauen und darüber ein echtes ICMP-Echo-Paket zu senden und auszuwerten ob du ein entsprechendes Echo bekommst.
 
Vermutlich reißt mir gleich ein C++ Experte den Kopf ab, aber was solls :D.

Dein "ping -c 192.168.2." gibt dir vermutlich ein char* und wenn du darauf eine Zahl addierst verschiebst du nur den Pointer weiter nach vorne. Erst ein Zeichen, dann zwei Zeichen usw. Deswegen wird der "Befehl" auch immer kürzer bis du im Niemandsland deines Speicher landest :D.
 
Vielen Dank @Tsjuder für die erklärung meines Fehlers.
@bitmuncher Vielen Dank für die Hilfe
@Chromatin Auch an dich n FETTES Danke , das hilft mir , doch kriege ich das nicht in mein Projekt eingebaut , also die Header Datei ... Der sagt mir immer " "rawping.h" : No such file or directory" ...
Sie liegt aber schon im Projekt Ordner ... Bitte Helft mir :D
EDIT:// Anfängerfehler :D statt "" zu nutzen habe ich <> genutzt ...

gz RiG
 
Zuletzt bearbeitet:
Also eines steht außer Frage: C++ ist definitiv nicht einfach, denn es ist verdammt umfangreich ;)

Also system() nimmt einen char* als Parameter und wenn du eine Zeichenkette mit einer Zahl "zusammenschweißen" willst (oder überhaupt um Zahlen in Strings umzuwandeln), dann ist bitmunchers Vorschlag richtig.
sprintf funktioniert so wie printf, nur dass das Ergebnis nicht auf der Konsole, sondern in einem Puffer im Speicher landet. Den muss man aber zuvor angelegt haben, weswegen ich bezweifle, dass bitmunchers Code funktioniert.

Meiner Meinung nach müsste es so aussehen:
Code:
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;

int main() {
  int i;
  char cmd[20]= "ping 192.168.2.";
 
  for(i = 0; i < 256; i++){
    sprintf(cmd+15, "%d", i);
    system(cmd);
  }
  return 0;
}

Und das da ist übrigens reines C im C++-Gewand. Also von C++ sieht man in dem Beispiel noch nicht viel. Der einzige Unterschied sind die Header und das namespace:

Code:
#include <stdio.h>
#include <stdlib.h>

int main() {
  int i;
  char cmd[20]= "ping 192.168.2.";
 
  for(i = 0; i < 256; i++){
    sprintf(cmd+15, "%d", i);
    system(cmd);
  }
  return 0;
}

Außerdem: Laut C-Standard gibt dir system() (sofern auf dem Betriebssystem möglich), den "Exit-Code" des aufgerufenen Programms zurück (also das, was die main() des aufgerufenen Programms zurückgibt sozusagen). Und ping scheint 0 zurückzugeben, wenn es funktioniert und 1 wenn nicht.
 
Zuletzt bearbeitet:
Den muss man aber zuvor angelegt haben, weswegen ich bezweifle, dass bitmunchers Code funktioniert.

Code:
bitmuncher@mbp2:~/src> cat test.cpp
#include <cstdlib>
#include <iostream>
using namespace std;

int main() {
  int i;
  char *cmd;
  char basecmd[25] = "ping -c 1 192.168.2.";

  for(i = 0; i < 256; i++){
    sprintf(cmd, "%s%d", basecmd, i);
    system(cmd);
  }
}
bitmuncher@mbp2:~/src> g++ -o test test.cpp
bitmuncher@mbp2:~/src> ./test
PING 192.168.2.0 (192.168.2.0): 56 data bytes

--- 192.168.2.0 ping statistics ---
1 packets transmitted, 0 packets received, 100.0% packet loss
PING 192.168.2.1 (192.168.2.1): 56 data bytes

--- 192.168.2.1 ping statistics ---
1 packets transmitted, 0 packets received, 100.0% packet loss
PING 192.168.2.2 (192.168.2.2): 56 data bytes

...

wzbw. ;)
 
RawSocks brauchen afaik Adminrechte ;)

Tsjuder hat recht: "foo" ist erstmal ein const char[] - Array. Bzw. ein Pointer darauf. "+zahl" wird auf den Pointer addiert. Gemeinerweise wirft nur der Clang Compiler eine Warnung, GCC aber, trotz "-Wall" Option erstmal nicht.
Hier sieht man die "Einfachkeit" des C++ ;)

So. In "purem" C++ sollte das in etwa so ausschauen:
Code:
[color=#007020]#include <iostream>
#include <stdlib.h>
[/color]
[color=#902000]int[/color] [color=#06287e]main[/color](){
  [color=#007020][b]for[/b][/color] ([color=#902000]int[/color] i[color=#666666]=[/color][color=#40a070]0[/color];i[color=#666666]<[/color][color=#40a070]4[/color];i[color=#666666]++[/color]){
    std[color=#666666]::[/color]string ping_addr [color=#666666]=[/color] [color=#4070a0]"127.0.0."[/color] [color=#666666]+[/color] std[color=#666666]::[/color]to_string(i);
    [color=#007020][b]auto[/b][/color] ping_cmd [color=#666666]=[/color] [color=#4070a0]"ping -c 1 "[/color] [color=#666666]+[/color] ping_addr [color=#666666]+[/color] [color=#4070a0]"[/color][color=#4070a0][b]\n[/b][/color][color=#4070a0]"[/color] ;
    [color=#902000]int[/color] ret [color=#666666]=[/color] system(ping_cmd.c_str());  [color=#60a0b0][i]// sytem möchte einen c string haben
[/i][/color]    [color=#007020][b]if[/b][/color] (ret [color=#666666]!=[/color] [color=#40a070]0[/color]){
      std[color=#666666]::[/color]cout [color=#666666]<<[/color] ping_addr [color=#666666]<<[/color] [color=#4070a0]" failed"[/color] [color=#666666]<<[/color] std[color=#666666]::[/color]endl;
    } [color=#007020][b]else[/b][/color] {
      std[color=#666666]::[/color]cout [color=#666666]<<[/color] ping_addr [color=#666666]<<[/color] [color=#4070a0]" ok"[/color] [color=#666666]<<[/color] std[color=#666666]::[/color]endl;
    }
  }
}
braucht allerdings C++11 unterstützenden Compiler.

Das:
Code:
[color=#007020]#include <iostream>
#include <stdlib.h>
#include <cstdio>
[/color]
[color=#902000]int[/color] [color=#06287e]main[/color](){
  [color=#902000]char[/color] output_buf[[color=#40a070]256[/color]];
  [color=#007020][b]for[/b][/color] ([color=#902000]int[/color] i[color=#666666]=[/color][color=#40a070]1[/color];i[color=#666666]<[/color][color=#40a070]4[/color];i[color=#666666]++[/color]){
    snprintf(output_buf, [color=#40a070]256[/color], [color=#4070a0]"ping -c 1 192.168.56.%d"[/color], i);
    [color=#902000]int[/color] ret [color=#666666]=[/color] system(output_buf);
    [color=#007020][b]if[/b][/color] (ret [color=#666666]!=[/color] [color=#40a070]0[/color]){
      printf([color=#4070a0]"%.256s failed[/color][color=#4070a0][b]\n[/b][/color][color=#4070a0]"[/color], output_buf); [color=#60a0b0][i]// wir wollen max. 256 Zeichen haben
[/i][/color]    } [color=#007020][b]else[/b][/color] {
      printf([color=#4070a0]"%.256s ok[/color][color=#4070a0][b]\n[/b][/color][color=#4070a0]"[/color], output_buf);
    }
  }
}
ist dann wiederum C. Für Winversion des Pingtools sollte "-c 1" durch "-n 1" ersetzt werden und ggf. möchte man noch "-w 3000" (Timeout in Millisekunden) setzen.

Allerdings hast Du noch mehr Probleme:
Normalerweise soll ein Programm beim Beenden einen sinnvolen Rückgabecode liefern. Sowas wie "0" bei Erfolg und !=0 im Fehlerfall. Damit soll man Programme aus anderen Programmen/Scripten aufrufen,
ohne die genaue Programmausgabe auseinandernehmen zu müssen (denn: 1) aufwändig und 2) wenn das Programm lokalisiert ist und dem Benutzer Meldungen in seiner Sprache liefert, wird es noch aufwändiger ;))
Jedoch scheint Windows-"Ping" das in einingen Fällen nicht soo genau zu nehmen und auch mal 0 zurückzugeben, obwohl irgendetwas schief gelaufen ist (daher auch die zahlreichen "komplizierten" Lösungen bei Google - man muss die komplette Ausgabe parsen)

Und nicht zuletzt: wie willst Du die Daten verschicken? Ich habe hier die Netzlaufwerkfreigaben im Verdacht. Allerdings muss nicht jeder Rechner,
der auf Pings antwortet, so eine Freigabe haben und umgekehrt;)
Und zumindest früher war es bei vielen "Sicherheitstools" üblich, nicht auf PINGs zu antworten - das wurde dann von Marketingleuten "Stealthmode" genannt :rolleyes: (vgl. mit "ich bin nicht da" Antwort beim Klingeln an der Tür)
D.h Du könntest in dem Fall gleich probieren, die Dateien zu senden.

Edit: ihr seid gemein :(
@bit:
Code:
CDW@highlander-jr:~/projects/pinger % g++48 bit.cpp
bit.cpp: In function 'int main()':
bit.cpp:11:36: error: 'sprintf' was not declared in this scope
     sprintf(cmd, "%s%d", basecmd, i);
                                    ^
CDW@highlander-jr:~/projects/pinger % clang++ -Wall bit.cpp
bit.cpp:11:13: warning: variable 'cmd' is uninitialized when used here
      [-Wuninitialized]
    sprintf(cmd, "%s%d", basecmd, i);
            ^~~
bit.cpp:7:12: note: initialize the variable 'cmd' to silence this warning
  char *cmd;
           ^
            = NULL
1 warning generated.
CDW@highlander-jr:~/projects/pinger % clang++ bit.cpp 
CDW@highlander-jr:~/projects/pinger % ./a.out 
zsh: segmentation fault  ./a.out
... adding <cstdio>...
DW@highlander-jr:~/projects/pinger % g++48 bit.cpp -o bit && ./bit
zsh: segmentation fault  ./bit
;)
 
Zuletzt bearbeitet:
Vielen Dank CDW. Dein Quellcode funktioneirt fast einwandfrei.
Undzwar gibt er mir trz. nicht erreichbarkeit ein "ok" aus.
Also wenn der Zielhost nicht erreichbar ist , sagt er mir "ok" :D

gz RiG
 
Zurück
Oben