|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Utente sospeso
Iscritto dal: Oct 2002
Messaggi: 2156
|
quali funzioni per accedere al datagramma ethernet in linux
ciao, sto cercando dei link che descrivano le union e le struct che permettono di accedere al pacchetto ethernet...sto cercando da mezz'ora e non ho trovato nulla!
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Prova a vedere qui dentro:
linux/if_ether.h |
|
|
|
|
|
#3 |
|
Utente sospeso
Iscritto dal: Oct 2002
Messaggi: 2156
|
si c'avevo già guardato....in effetti il mio problema è più che altro di "formattazione"...per esempio un indirizzo fisico ethernet ( 6 coppie di cifre esadecimali separate dai : ) lo vorrei stampare così e invece me lo dà in decimale....poi ho anche dei problemi a stampare ( nel senso di cout<< o printf
ps: leggere gli header file non è proprio semplicissimo..... cosa vuol dire #endif ??? |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
E' una direttiva al compilatore :
Solitamente comincia così: #ifndef PIPPO ... #endif Se non è definito PIPPO... Per gli include si fa sempre questa cosa: #ifndef PIPPO_H #define PIPPO_H ... #endif Serve per evitare di includere più volte gli stessi header... |
|
|
|
|
|
#5 |
|
Utente sospeso
Iscritto dal: Oct 2002
Messaggi: 2156
|
ho un'altra domanda: se accedo all'header di un pacchettto ip che funzioni devo usare per trasformare l'indirizzo ip ( 32 bit) nella notazione quadripuntata che tutti conosciamo?? (accedo ai cambi s_addr[32] e d_addr[32] tramite un puntatore alla struct iphdr)...sono giorni che cerco questa funzione ma non l'ho trovata...
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Io su Win uso inet_ntoa...dovrebbe essere la stessa...
|
|
|
|
|
|
#7 |
|
Utente sospeso
Iscritto dal: Oct 2002
Messaggi: 2156
|
si ma probabilmente la usi su un puntatore dereferenziato alla struct sockaddr_in..ora sono su win e il sorgente ce l'ho in una partizione linux...inet_ntoa non può essere applicata direttamente ai campi indirizzi dell'header ip.....sto impazzendo...oltretutto non sono ancora riuscito a trovare la funzione che trasforma l'indirizzo mac decimale nella notazione normale....mi ci vorrebbe una enciclopedia con tutte le funzioni del c++
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ah...ma te vuoi il dotted decimale dell'indirizzo MAC ?
|
|
|
|
|
|
#9 |
|
Utente sospeso
Iscritto dal: Oct 2002
Messaggi: 2156
|
no voglio la versione esadecimale saperata da :
per esempio 00:00:e3:99:f4:00 |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Non te la puoi calcolare da solo ? E' banale
|
|
|
|
|
|
#11 |
|
Utente sospeso
Iscritto dal: Oct 2002
Messaggi: 2156
|
mmmm...si tratterebbe di prendere 8 bit per volta (= due cifre esadecimali) e stampare un : tra ogni coppia....come faccio però a prendere 8 bit per volta da un numero di 48 bit ?( castarli in hex è facile)...
sto pensando che si potrebbe ottenere questa informazione ( x l'host, non per chi si collega) anche interrogando il dirver della scheda di rete...il guaio è che non ho la minima idea di come si faccia... |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Dimmi come sono memorizzati...sia il MAC che l'ip (soprattutto il tipo mi interessa)...
|
|
|
|
|
|
#13 |
|
Utente sospeso
Iscritto dal: Oct 2002
Messaggi: 2156
|
ho risolto il discorso MAC, avevi ragione,
eccoti il codice: for (int i = 0; i<6 ; i++) { cout<<hex<<int(ethernet_datagram->h_dest[i]); if (i!=5) cout<<":"; } cout<<endl; hex lo usi includendo iomanip.h... per l'indirizzo ip la vedo dura....perchè nell'header IP è un u_int32_t suggerimenti? |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Si faceva bene anche con il C...
Codice:
char tmp[18]; sprintf(tmp,"%x:%x:%x:%x:%x:%x", e->h_dest[0], e->h_dest[1], ....); Codice:
struct in_addr {
union {
struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct { u_short s_w1,s_w2; } S_un_w;
u_long S_addr;
} S_un;
};
Codice:
in_addr addr; addr.S_un.S_addr = (u_long)il_tuo_u_int32_t; inet_ntoa(addr); Altrimenti si ricorre al trucco: Codice:
unsigned char *ip = (unsigned char *)&il_tuo_u_int32_t; Dopo accedendo da ip[0] a ip[4] hai le varie parti dell'ip... |
|
|
|
|
|
#15 |
|
Utente sospeso
Iscritto dal: Oct 2002
Messaggi: 2156
|
nell'ultimo pezzo di codice che significato ha & ?
grazie cmq forse non è cmq complicato, per esempio basterebbe prendere 8 bit alla volta dei 32 dell'indirizzo ip e castarli a int uno per uno... |
|
|
|
|
|
#16 | ||
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Quote:
|
||
|
|
|
|
|
#17 |
|
Utente sospeso
Iscritto dal: Oct 2002
Messaggi: 2156
|
scusa domanda scema....è ovvio che è l'operatore address of ....sarà il caldo
|
|
|
|
|
|
#18 |
|
Utente sospeso
Iscritto dal: Oct 2002
Messaggi: 2156
|
ho risolto come dicevo io...è incredibile come certe volte uno perde tempo a pensare a cose complicate e invece basta scrivere due righe di codice e risolvi il problema in cinque minuti...
eccoti la funzione con un main di prova: //funzione che riceve in input il campo indirizzo ( sorgente e/o destinazione) dell'header IP #include <iostream.h> #include <iomanip.h> void StampaIP(unsigned int indirizzo) { unsigned int maschera1=0x000000FF; unsigned int maschera2=0x0000FF00; unsigned int maschera3=0x00FF0000; unsigned int maschera4=0xFF000000; unsigned int ris1 = indirizzo & maschera1; unsigned int ris2 = indirizzo & maschera2; unsigned int ris3 = indirizzo & maschera3; unsigned int ris4 = indirizzo & maschera4; ris2 >>= 8; ris3 >>= 16; ris4 >>= 24; cout<<ris4<<"."<<ris3<<"."<<ris2<<"."<<ris1<<endl; } void main() { unsigned int indirizzo; cout<<"inserire un numero di 8 cifre esadecimali:"<<endl; cin>>hex>>indirizzo; cout<<"l'indirizzo IP e': "; StampaIP(indirizzo); } l'ho provato adesso ed è ok: se indirizzo è effettivemente saddr o daddr va passato in host to network long, non so se è linux (mandrake9.1) che lo vuole così o la cpu del mio portatile ( pentium3 m) o tutti e due....pensandoci bene non è necessaria la mascheratura, basta fare 4 shift e dopo ciascuno shift assegnare i vari pezzi dell'indirizzo IP. ora grazie alla mia funzione posso levarmi dalle palle la structsockaddr_in e usare solo i campi sadddr e daddr dell'header ip il che mi sembra più chiaro e pulito ...se ci sono altri problemi mi rifaccio vivo in questo thread, per intanto ti saluto e ti ringrazio (mi sembri un programmatore professionista..sbaglio? ciao!! BK ps: il programma che sto scrivendo è uno sniffer per rete locale.. |
|
|
|
|
|
#19 |
|
Utente sospeso
Iscritto dal: Oct 2002
Messaggi: 2156
|
ho un altra domanda> lo sniffer inizialmente chiede quanti pacchetti sniffare e per interromperlo prima che abbia finito devo schiacciare ctrl + c io vorrei che controllasse se, mentre sniffa, l utente ha premuto il tasto ESC, e se si si interrompe e fa vedere quello che ha sniffato...come faccio a fare un monitoraggio del tasto ESC?
|
|
|
|
|
|
#20 |
|
Utente sospeso
Iscritto dal: Oct 2002
Messaggi: 2156
|
cionci ci sei?? ( ma perchè con konqueror non posso usare le emotincohns????? )
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:36.



















