在C中编写基本的traceroute脚本

d.h*_*ill 6 c udp traceroute raw-sockets icmp

我必须写一个trceroute脚本,但我不确定我的尝试是否正确.

现在我就这样做(如果我做错了或笨拙,请纠正我):

  1. 得到了ip-和udpheader的结构
  2. 校验和功能
  3. 打开2个套接字:一个用于在SOCK_RAW模式下发送UDP数据包(用于操作ttl),另一个用于从路由器接收ICMP应答.
  4. 使用sendto()发送UDP数据包
  5. 不知道如何接收和处理ICMP答案

有没有更好的方法来改变TTL而不是使用sock_raw,我必须自己定义所有的标题?打开ICMP袜子时,我应该为socket()使用什么参数?如何收到ICMP答案?

Nik*_*sov 2

您的目标平台是什么?这是来自OpenBSD 源代码的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");
Run Code Online (Sandbox Code Playgroud)

我相信,在 Linux 上,您需要将IP_RECVERRrecvmsg(2)MSG_ERRQUEUE, see一起使用ip(7)