我必须写一个trceroute脚本,但我不确定我的尝试是否正确。
现在我就这样做(如果我做错了或笨拙,请纠正我):
有没有更方便的方法来改变TTL而不是使用sock_raw,我必须自己定义所有的标题内容? 打开ICMP袜子时,我应该为socket()使用什么参数? 如何收到ICMP答案?
答案 0 :(得分:2)
您定位的是什么平台?这是来自OpenBSD source的BSD风格:
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");
在Linux上,我相信,您需要将IP_RECVERR
和recvmsg(2)
与MSG_ERRQUEUE
一起使用,请参阅ip(7)
。
答案 1 :(得分:2)
就设置TTL而言,您可以使用setsockopt()
。以下是Linux上ping
的iputils源代码的摘录:
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);
}