2011-02-03 14 views
6

Devo scrivere uno script trceroute ma non sono sicuro che i miei tentativi siano corretti.Scrittura di uno script traceroute di base in C

In questo momento sto facendo così (per favore correggetemi se sto facendo di sbagliato o goffo):

  1. ottenuto una struct per IP e udpheader
  2. Una funzione di checksum
  3. Apertura di 2 socket: uno per l'invio di pacchetti UDP in modalità SOCK_RAW (per manipolare ttl) e uno per ricevere risposte ICMP dai router.
  4. Utilizzando sendto() per inviare pacchetto UDP
  5. Non avendo idea di come ricevere ed elaborare una risposta ICMP

ci sono modi più comodi per cambiare la TTL che usare SOCK_RAW dove devo definire tutte roba da intestazione da solo? Quali parametri dovrei usare per socket() quando si apre la calza ICMP? Come ricevere la risposta ICMP?

risposta

2

Quale piattaforma stai prendendo di mira? Ecco un sapore BSD da OpenBSD source:

if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) 
    err(5, "icmp socket"); 
if ((sndsock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) 
    err(5, "raw socket"); 

Su Linux, io credo, è necessario utilizzare IP_RECVERR e recvmsg(2) con la MSG_ERRQUEUE, vedi ip(7).

+0

Grazie per la risposta. Mi ha portato avanti una litte. –

2

Per quanto riguarda l'impostazione del TTL, è possibile utilizzare setsockopt(). Ecco un estratto dal sorgente di iputils per ping su Linux:

if (setsockopt(icmp_sock, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, 1) == -1) { 
    perror ("ping: can't set multicast time-to-live"); 
    exit(2); 
} 

if (setsockopt(icmp_sock, IPPROTO_IP, IP_TTL, &ittl, sizeof(ittl)) == -1) { 
    perror ("ping: can't set unicast time-to-live"); 
    exit(2); 
} 
+0

Grazie, sembra renderlo molto più semplice. –