• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Połączenie funkcji warunkowej if oraz funkcji system()

Object Storage Arubacloud
0 głosów
317 wizyt
pytanie zadane 17 lipca 2015 w C i C++ przez ZbieraczQQrydzy Nowicjusz (120 p.)
edycja 17 lipca 2015 przez ZbieraczQQrydzy

To mój pierwszy post na forum więc witam wszystkich serdecznie.

Pisząc swój pierwszy większy program natrafiłem na problem z którym nie mogę sobie poradzić. Chcę aby zależnie od wyniku:
string kom = "ping 192.168.0.2";
if (system(kom.c_str())){
   instrukcja
}
program wykonywał, lub nie, w/w instrukcję. Problem jest w tym, że system() nie zwraca wartości 0 lub 1, a jedynie wyświetla na ekranie (lub po przekierowaniu strumienia np. zapisuje do pliku) efekt pingowania. Można to jakoś obejść? Jedynym, co mi przychodzi do głowy, to przerobienie programu Mike'a Muuss'a na kod c++ tak, aby można było użyć go jako wewnętrznej funkcji. Jest na to jakieś prostsze rozwiązanie? Będę wdzięczny za wszelkie sugestie, choćby nakierowanie, czego powinienem się nauczyć, żeby było to możliwe.

Pozdrawiam

edit:
Wklejam trochę więcej kodu, aby łatwiej można było zrozumieć o co mi chodzi. To jest wycinek z większej całości, ale przerobiony tak, że można go uruchomić pomimo wyseparowania. Zapomniałem też dodać, że program jest pisany równocześnie na dwa systemy - Windows XP i Ubuntu 15.04.
 

//kompilacja wymaga dodatnia -std=c++11

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>

using namespace std;

int main(){
system("clear"); //"cls" dla Win
cout << "Sterowniku_zgłoś_się!" << endl << "ver. 0.0.0.1" << endl << endl;
cout << "Podaj zakres adresów do sprawdzenia: ";
cout << "192.168.od1->do1.od2->do2" << endl;
int od1, do1, od2, do2;
cout << "od1: ";
cin >> od1;
cout << "do1: ";
cin >> do1;
cout << "od2: ";
cin >> od2;
cout << "do2: ";
cin >> do2;

cout << "192.168." << od1 << "->" << do1 << "." << od2 << "->" << do2 << endl;
cout << "Koniec pobierania danych. Pingowanie..." << endl;


for (int i=od1; i <= do1; i++)
  for (int j=od2; j <= do2; j++){
    string kom = "ping -q -c 1 -l 1 -W 0.01 192.168", ip = "."; // "ping -a -n 1 -l 1 -w 25 192.168" dla Win
    string ii = to_string(i);
    string jj = to_string(j);
    ip+=ii;
    ip+=".";
    ip+=jj;
    kom += ip;
    kom += " >> log.txt"; // " >> c:/log.txt" dla Win
    cout << kom << endl;
    system(kom.c_str());
  }
return 0;
}

 

4 odpowiedzi

0 głosów
odpowiedź 17 lipca 2015 przez niezalogowany
Witaj serdecznie na naszym pięknym forum! ;)

No więc: może daj troszkę więcej kodu (jak chcesz zedytować opis, to kliknij ołówek pod odpowiedzią, a następnie żeby dodać kod, kliknij obrazek z klamerkami { }, wybierz język i wklej ;)), albo troszkę więcej wytłumaczenia, bo jak na razie wpadł mi pomysł, żeby funkcja jednak zwracała 1 albo 0, czyli true albo false, czyli że po prostu zmień ją na bool.

Nie wiem czy to poprawna odpowiedź, ale naprowadź mnie na nią ;)
komentarz 17 lipca 2015 przez ZbieraczQQrydzy Nowicjusz (120 p.)
Dodałem trochę więcej kodu, może teraz będzie łatwiej zrozumieć o co mi chodzi.
Aktualna wersja kodu powoduje, że wszystkie pingi są zapisywane do log.txt, zaś ja bym chciał mieć tylko te, w przypadku których pakiety dotarły. Potrafię wyedytować plik tekstowy, tzn usunąć niepotrzebne linijki, ale jest to problematyczne, bo wzrasta czas wykonywania się całości, który już teraz jest dość duży - w maksymalnym przypadku około 9h, oraz zmiana np języka sytemu operacyjnego lub jego wersji powodowałaby, że usuwanie nie działałoby prawidłowo, tzn program nie byłby uniwersalny. Oczywiście najlepiej byłoby zrezygnować zupełnie z system(), ale jeszcze nie rozgryzłem jak to zrobić.
0 głosów
odpowiedź 17 lipca 2015 przez Dorion300 Szeryf (90,250 p.)
Niestety ale tak się nie da z "System"

Gdyż "System" tylko wykonuje polecenia konsolowe, a te polecenia konsolowe od razu wypisują na ekran informacje.

Nie polecam używać "system" to wszystkiegom gdyż widać jaki on jest ubogi dla programu.

Wątpię aby ci się udało to "obejść".

Podejrzewam że bibloteczka Winsock będzie potrafiła pingować.
komentarz 17 lipca 2015 przez ZbieraczQQrydzy Nowicjusz (120 p.)
Z Winsock problem jest taki, że jest to rozwiązanie dedykowane dla systemów z rodziny Windows. A chciałbym, żeby mój program miał kilka portów - pod najczęściej używane systemy.
0 głosów
odpowiedź 17 lipca 2015 przez hit02 Nałogowiec (33,970 p.)

Z tego co widzę, system() powinno zwrócić wartość int zwróconą przez polecenie. Chyba nie powinno  Tutaj masz to nieco szeżej wyjaśnione.http://www.cplusplus.com/reference/cstdlib/system/

Polecenie ping powinno zwrócić 0 w przypadku powodzenia i 1 w przypadku niepowodzenia.

0 głosów
odpowiedź 17 lipca 2015 przez MrWeb Stary wyjadacz (10,200 p.)
Cześć, jeśli chcesz sprawdzić, czy otrzymujesz odpowiedź od adresu IP, to możesz bawić się z niskopoziomowymi pakietami - http://tangentsoft.net/wskfaq/examples/rawping.html

lub użyć takiej fajnej funkcji - https://msdn.microsoft.com/en-us/library/aa366050(VS.85).aspx

 

Wykorzystaj kod na dole strony, wystarczy go tylko lekko zmodyfikować żebyś otrzymał swoją wartość polecenia ping dla instrukcji :D
komentarz 17 lipca 2015 przez ZbieraczQQrydzy Nowicjusz (120 p.)
Byłoby to rozwiązanie idealne, gdyby nie fakt, że tylko pod Windows. :( No chyba, że istnieje jakaś alternatywa dla winsock2.h pod inne OSy?

Podobne pytania

0 głosów
2 odpowiedzi 196 wizyt
pytanie zadane 22 października 2019 w C i C++ przez xZenit Użytkownik (760 p.)
0 głosów
0 odpowiedzi 90 wizyt
pytanie zadane 18 stycznia 2020 w C# przez r.mar Początkujący (470 p.)
0 głosów
2 odpowiedzi 279 wizyt

92,552 zapytań

141,399 odpowiedzi

319,532 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...