1 #include "trace.h"
2 int main(int argc,char * argv[])
3 {
4
5 if(argc != 2) {
6 fprintf(stderr,"Usage: %s hostname\n",argv[0]);
7 exit(-1);
8 }
9
10 const int max_ttl = MYMAXTTL;
11 const int nprobes = NPROBES;
12
13 struct hostent *phost;
14 struct sockaddr_in host_addr;
15 struct sockaddr_in locate_addr;
16 bzero(&host_addr,sizeof(host_addr));
17
18
19 host_addr.sin_family = AF_INET;
20 host_addr.sin_addr.s_addr = inet_addr(argv[1]);
21 host_addr.sin_port = htons(DSTPORT);
22
23
24 if(host_addr.sin_addr.s_addr == INADDR_NONE){
25 if(NULL == (phost = gethostbyname(argv[1]))) {
26 fprintf(stderr,"unknown host %s\n",argv[1]);
27 exit(-1);
28 }
29
30 memcpy(&host_addr.sin_addr,phost->h_addr,phost->h_length);
31 }
32
33
34 locate_addr.sin_family=AF_INET;
35 locate_addr.sin_addr.s_addr=htonl(INADDR_ANY);
36 locate_addr.sin_port=htons(SRCPORT);
37 int sendfd,recvfd;
38
39
40 if ((sendfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
41 fprintf(stderr,"sendfd: udp socket\r\n");
42 exit(-1);
43 }
44
45 if ((recvfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) {
46 fprintf(stderr,"recvfd: raw socket\r\n");
47 exit(-1);
48 }
49
50
51 if(bind(sendfd,(struct sockaddr*)&locate_addr,sizeof(locate_addr))) {
52 fprintf(stderr,"bind error\r\n");
53 exit(-1);
54 }
55
56 fprintf(stdout, "traceroute to %s (%s)", argv[1],inet_ntoa(host_addr.sin_addr));
57 fprintf(stdout, ", %d hops max, %d byte packets\r\n", max_ttl, UDPPACKETSIZE+sizeof(struct ip)+sizeof(struct udphdr));
58
59 char data_buf[MAXPACKET];
60 struct sockaddr_in src_addr;
61 int ttl = 0;
62
63 for (ttl = 1; ttl <= max_ttl; ++ttl) {
64 u_long last_addr = 0;
65 int got_there = 0;
66 printf("%2d ", ttl);
67 fflush(stdout);
68 int probe = 0;;
69 for (probe = 0; probe < nprobes; ++probe) {
70 int len_data = 0;
71 struct timeval t1, t2;
72 struct timezone tz;
73 struct ip *ip;
74
75 gettimeofday(&t1, &tz);
76 send_probe(sendfd,&host_addr,ttl);
77
78 while (len_data = wait_reply(recvfd, &src_addr,data_buf,sizeof(data_buf))) {
79 gettimeofday(&t2, &tz);
80
81 if (check_packet(data_buf, len_data) != 0) {
82
83 if (src_addr.sin_addr.s_addr != last_addr) {
84 printf("%s ",inet_ntoa(src_addr.sin_addr));
85 last_addr = src_addr.sin_addr.s_addr;
86 }
87
88 printf(" %g ms ", tv_sub(&t1, &t2));
89 if(src_addr.sin_addr.s_addr == host_addr.sin_addr.s_addr)
90 got_there++;
91 break;
92 }else if(check_packet(data_buf,len_data) == 0){
93 printf("check_pakcet wrong\n");
94 }
95 }
96 if (len_data == 0)
97 printf(" * ");
98 }
99 printf("\n");
100 if (got_there)
101 break;
102 }
103 return 0;
104 }
105
106