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 ?














GDR!
28 sierpnia 2007
02:45:16
popen() ?
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.
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++
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.
fooshmer
28 sierpnia 2007
07:52:04
Przeparsuj sobie plik /proc/net/arp.
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.
mh
28 sierpnia 2007
08:32:45
ioctl, SIOCGIFHWADDR
Artur Nowosielski
28 sierpnia 2007
09:52:54
GLib/glibmm (rozdział manuala: Spawning Processes)
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
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.
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.
28 sierpnia 2007
10:55:22
Oczywiście musiałeś dodać ten wpis do techbloga?
GDR!
28 sierpnia 2007
11:09:22
A czemu nie do techbloga niby?
28 sierpnia 2007
11:10:32
Proponuję przeczytać http://wiki.jogger.pl/wiki/TechBlog.
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 "
owiększa wiedzę czytelnika" i miesci się w definicji techbloga

Dzięki wszytskim za porady, czas wziąść się za testowanie
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)
28 sierpnia 2007
13:23:44
Wiele razy widziałem jak sparrow upominał osoby, które robiły dokładnie to samo.
owiększa wiedzę czytelnika" i miesci się w definicji techbloga
"
[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 "
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ąć.
28 sierpnia 2007
13:27:15
Wpis usunięty z techbloga.
28 sierpnia 2007
15:09:17
no ok, przyznaje się do błędu, obiecuje poprawe :D
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.
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