I have to write a trceroute script but I'm not sure if my attempts are correct.
Right now I'm doing it like that (please correct me if I'm doing wrong or clumsy):
- Got an struct for ip- and udpheader
- A checksum function
- Opening 2 sockets: One for sending UDP-packets in SOCK_RAW mode (to manipulate ttl) and one to receive ICMP-answers from the routers.
- Using sendto() to send UDP packet
- Having no clue how to receive and process an ICMP answer
Are there any more comfortable ways to change the TTL than using sock_raw where I have to define all header stuff by myself? What parameters should I use for socket() when opening ICMP sock? How to receive the ICMP answer?
What platform are you targeting? Here's a BSD flavor from OpenBSD source:
On Linux, I believe, you need to use
IP_RECVERR
andrecvmsg(2)
with theMSG_ERRQUEUE
, seeip(7)
.