LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 839|回复: 1

请教编写traceroute的问题

[复制链接]
发表于 2006-3-16 23:15:15 | 显示全部楼层 |阅读模式
是这样的,我要用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,但是只要是不可达的就有问题了.谢谢各位高人了
发表于 2006-3-18 10:40:35 | 显示全部楼层
Post by lcrystal
我觉得我发送UDP的包去一个不可达的IP,书上写会在recvfrom那阻塞,因为不可达,

发送是sendto,关recvfrom何事? 发送udp到不可达ip,是不会阻塞的。

但我觉得既然sockRaw是对应ICMP的,那就应该能收到,而且事实上我试了,确实能收到.
printf("%d\n",recvfrom(sockRaw,recvbuf,sizeof(recvbuf),0,NULL,NULL));
输出的和recvbuf的大小有关.

这里,我的测试结果是,返回 -1
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表