C++ / int system()

28 sierpnia 2007 o godzinie 02:39:02 w kategoriach: Programowanie, lvl0.

Wpisujemy w konsoli prośbę o zwrot MACa podanego IP:

~$ arp -na 192.168.2.1

... i otrzymujemy go, zgodnie z prośbą:

? (192.168.2.1) at 00:11:22:33:44:55 [ether] on eth0

Identyczny wynik otrzymamy zaprzęgając do tego zadania C++ i jego prostą funkcję system():

#include int main() { if (system("arp -na 192.168.2.1")) std::cout << "Działa !"; return 0; }

Tylko powiedzcie mi proszę Was bardzo co zrobić jesli chciałbym WYNIK tej komendy (arp -na 192.168.2.1) wrzucić do zmiennej ?

string gate_mac = system("arp -na 192.168.2.1");

Pewnie że nie, bo otrzymamy błąd zgodności typów, w koncu system() zwraca kod błędu jako integer.

No własnie, w jaki sposób "skopiować" wynik takiej czy innej komendy do zmiennej programowej w celu wyfiltrowania z niej macadresu czy innych potrzebnych informacji ?

Jeśli ktoś z Was moi drodzy ma jakiś pomysł co z tym fantem zrobić, PISZCIE PROSZĘ ! Już nie wiem jak pytać googli, bo chyba wszystkie mozliwe zapytania wykorzystałem i nie uzyskałem odpowiedzi, na IRCu ktoś radzil przepisać całą funkcję system(). Any ideas ?

Komentarze »

  1. GDR!

    28 sierpnia 2007

    02:45:16

    popen() ?

  2. GDR!

    28 sierpnia 2007

    02:46:56

    Hm, pomijając już to, że takie sprawdzanie ARPa w programie to przesada. Na pewno jest jakieś ludzkie API do tego.

  3. jojek

    28 sierpnia 2007

    02:48:48

    nie wiem co to popen() ale już szukam :)
    no i pewnie masz racje pewnie da się to bardziej "ludzko" zrobić, ale nie można tego wymagać od studentq 1 roku informatyki który niedawno przerzucił sie z Pascala/Delphi na C++ ;p

  4. AdamK

    28 sierpnia 2007

    07:10:04

    Ogólnie: musisz przekierować stdout z uruchamianego programu do siebie. Jak to zrobić w C++ niestety nie wiem. Btw. Jojek ma racje, prawdopodobnie lepiej będzie użyć jakiegoś API, ale nie wiem jakiego (nigdy tego nie robiłem). Najlepiej zajrzyj w źródła arpa.

  5. fooshmer

    28 sierpnia 2007

    07:52:04

    Przeparsuj sobie plik /proc/net/arp.

  6. Caladan

    28 sierpnia 2007

    07:58:27

    A czy nie łatwiej napisać to w bashu/perlu/pythonie? Pisanie programu, który wywołuje funkcję system jest trochę takie jakieś hmmm, niesmaczne :D Albo jak wcześniej napisano, użyjesz API, albo siadaj do skryptów.

  7. mh

    28 sierpnia 2007

    08:32:45

    ioctl, SIOCGIFHWADDR

  8. Artur Nowosielski

    28 sierpnia 2007

    09:52:54

    GLib/glibmm (rozdział manuala: Spawning Processes)

  9. AdamK

    28 sierpnia 2007

    09:56:02

    Pod warunkiem że chce się zaprząc do programu gliba. O, tu jest dokumentacja z popen i praktycznie gotowiec: http://www.gnu.org/software/libc/manual/html_node/Pipe-to-a-Subprocess.html#Pipe-to-a-Subprocess

  10. Mouser

    28 sierpnia 2007

    10:50:48

    Może po prostu skonwertuj/sparsuj ją do stringa i potem wrzuć do zmiennej tekstowej. Nie piszę w C++, ale takie rozwiązanie jest w moim mniemaniu nawet logiczne :P.

  11. AdamK

    28 sierpnia 2007

    10:52:10

    Mouser: nie, bo Jojek chce mieć to co program dał na wyjściu, a to co zwraca system() to zupełnie co innego.

  12. Radarek

    28 sierpnia 2007

    10:55:22

    Oczywiście musiałeś dodać ten wpis do techbloga?

  13. GDR!

    28 sierpnia 2007

    11:09:22

    A czemu nie do techbloga niby?

  14. Radarek

    28 sierpnia 2007

    11:10:32

    Proponuję przeczytać http://wiki.jogger.pl/wiki/TechBlog.

  15. jojek

    28 sierpnia 2007

    13:09:41

    Radarek -> Podejrzewałem, że niektórym nie spodoba się kategoria tego wpsiu, bo jakby nie było to jest pytanie, a nie rozwiązanie problemu. Umieściłem go tutaj, własnie po to, by osoby posiadające większą wiedze od mojej, a przeglądające techbloga pomogły w rozwiązaniu problmu :) Ostatecznie na pytanie uzyskałem sporo porad, informacji, wyjaśnień, a więc wpis razem z komentarzami ";powiększa wiedzę czytelnika" i miesci się w definicji techbloga :)

    Dzięki wszytskim za porady, czas wziąść się za testowanie :)

  16. jojek

    28 sierpnia 2007

    13:13:15

    Caladan -> tak naprawdę to staram się właśnie przepisać kod z perla na c++, raz bo trzeba poćwiczyć c++ przed wrześniem, dwa bo byłem ciekaw który kod bedzie skrótszy i jaśniejszy (narazie perl prowadzi) :)

  17. Radarek

    28 sierpnia 2007

    13:23:44

    Wiele razy widziałem jak sparrow upominał osoby, które robiły dokładnie to samo.

    [cytaty z wiki joggera]

    "Ideą, dla której powstał Techblog jest gromadzenie tekstów powiększających wiedzę czytelnika, rozprzestrzeniających określone idee i tym podobne, a nie pytań i jednozdaniowych odnośników do informacji na popularnych portalach."

    "Ostatecznie na pytanie uzyskałem sporo porad, informacji, wyjaśnień, a więc wpis razem z komentarzami ";powiększa wiedzę czytelnika" i miesci się w definicji techbloga :)"

    Czytelnika czy autora?

    "Zawsze po zebraniu opinii i przetestowaniu programów możesz opisać rozwiązanie podane w komentarzach pod zadanym pytaniem na „zwykłym” Joggerze, co i w jaki sposób zostało użyte oraz umieścić taki wpis na Techblogu. To samo tyczy się rozwinięcia informacji podawanych na innych witrynach, co w tej informacji jest ciekawego, dlaczego ją nam polecasz."

    Chociaż Twój problem i tak jest zbyt prosty by pokazywać jego rozwiązanie na techblogu (to tylko moje zdanie) to ew. możesz zebrać odpowiedzi Twoich czytelników, napisać nową notkę w której postawisz problem, pokażesz rozwiązanie i z zadowoleniem dodasz do kategorii 'techblog'.

    "Inaczej nie będzie się on odróżniał od pierwszego lepszego forum internetowego, grupy mailowej czy Usenetowej."

    Nic dodać, nic ująć.

  18. sparrow

    28 sierpnia 2007

    13:27:15

    Wpis usunięty z techbloga.

  19. jojek

    28 sierpnia 2007

    15:09:17

    no ok, przyznaje się do błędu, obiecuje poprawe :D

  20. mig

    28 sierpnia 2007

    21:37:09

    Rozwiazanie oparte na strumieniach C++: http://static.int.pl/~mig21/files/ipstream/ipstream.tar.gz W pliku test.cpp przyklad uzycia, oczywisce trzeba skompilowac razem z ipstream.cpp.

  21. marsianinek

    08 października 2007

    16:04:04

    Wywołaj:
    arp -A 192.168.0.245 > plik.txt
    a potem to już zabawa z plikiem x.txt

Dodaj komentarz

W komentarzach nie działają znaczniki HTML, nowe linie tworzone są po nacisnięciu Entera. W komentarzach stosuj textile.

Powered by Jogger.pl

Design by jojek © 2007

Valid XHTML 1.0 i CSS