|
|
是这样的,我要用C写一个简单的traceroute.基本的代码为:
int sock,sockRaw,ttl;
struct sockaddr_in dest;
ttl = 1;
memset(&dest,0,sizeof(dest));
dest.sin_family = AF_INET;
dest.sin_addr.s_addr = inet_addr(argv[1]);
sock = socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);
sockRaw = socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);
setsockopt(sock, IPPROTO_IP, IP_TTL, (char *)&ttl, sizeof(int));
sendto(sock,buf,sizeof(buf),0,(struct sockaddr*)&dest,sizeof(dest));
recvfrom(sockRaw,recvbuf,sizeof(recvbuf),0,NULL,NULL);
问题出来了,我觉得我发送UDP的包去一个不可达的IP,书上写会在recvfrom那阻塞,因为不可达,但我觉得既然sockRaw是对应ICMP的,那就应该能收到,而且事实上我试了,确实能收到.
printf("%d\n",recvfrom(sockRaw,recvbuf,sizeof(recvbuf),0,NULL,NULL));
输出的和recvbuf的大小有关.
请问这是怎么回事,我不明白呀.哪位朋友写过traceroute,是怎么解决的?我现在如果是可达的IP,可以返回各个路由IP,但是只要是不可达的就有问题了.谢谢各位高人了 |
|