我正在尝试通过构造适当的 ip 标头和 icmp 标头来使用 icmp 原始套接字实现 traceroute。我使用的端口号是 7 并且我已经计算了校验和。每次增加跳数限制并发送一个数据包直到回复消息包含类型 0 的回显回复。
#include "libsock"
#include<netinet/ip.h>
#include<netinet/ip_icmp.h>
unsigned short
csum (unsigned short *buf, int nwords)
{
unsigned long sum;
for (sum = 0; nwords > 0; nwords--)
sum += *buf++;
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
return ~sum;
}
int
main (int argc, char *argv[])
{
if (argc != 2)
{
printf ("need destination for tracert\n");
exit (0);
}
int sfd = socket …Run Code Online (Sandbox Code Playgroud)