- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试通过构造适当的 ip header 和 icmp header 来使用 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 (AF_INET, SOCK_RAW, IPPROTO_ICMP);
char buf[4096] = { 0 };
struct ip *ip_hdr = (struct ip *) buf;
int hop = 0;
int one = 1;
const int *val = &one;
if (setsockopt (sfd, IPPROTO_IP, IP_HDRINCL, val, sizeof (one)) < 0)
printf ("Cannot set HDRINCL!\n");
struct sockaddr_in addr;
addr.sin_port = htons (7);
addr.sin_family = AF_INET;
inet_pton (AF_INET, argv[1], &(addr.sin_addr));
while (1)
{
ip_hdr->ip_hl = 5;
ip_hdr->ip_v = 4;
ip_hdr->ip_tos = 0;
ip_hdr->ip_len = 20 + 8;
ip_hdr->ip_id = 10000;
ip_hdr->ip_off = 0;
ip_hdr->ip_ttl = hop;
ip_hdr->ip_p = IPPROTO_ICMP;
inet_pton (AF_INET, "172.30.104.59", &(ip_hdr->ip_src));
inet_pton (AF_INET, argv[1], &(ip_hdr->ip_dst));
ip_hdr->ip_sum = csum ((unsigned short *) buf, 9);
struct icmphdr *icmphd = (struct icmphdr *) (buf + 20);
icmphd->type = ICMP_ECHO;
icmphd->code = 0;
icmphd->checksum = 0;
icmphd->un.echo.id = 0;
icmphd->un.echo.sequence = hop + 1;
icmphd->checksum = csum ((unsigned short *) (buf + 20), 4);
sendto (sfd, buf, 28, 0, SA & addr, sizeof addr);
char buff[4096] = { 0 };
struct sockaddr_in addr2;
socklen_t len = sizeof (struct sockaddr_in);
recvfrom (sfd, buff, 28, 0, SA & addr2, &len);
struct icmphdr *icmphd2 = (struct icmphdr *) (buff + 20);
if (icmphd2->type != 0)
printf ("hop limit:%d Address:%s\n", hop, inet_ntoa (addr2.sin_addr));
else
{
printf ("Reached destination:%s with hop limit:%d\n",
inet_ntoa (addr2.sin_addr), hop);
exit (0);
}
hop++;
}
return 0;
}
argv[1]
是
"127.0.0.1"
o/p 是
hop limit:0 Address:127.0.0.1
Reached destination:127.0.0.1 with hop limit:1
recvfrom
.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<arpa/inet.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<unistd.h>
#include<pthread.h>
#include<poll.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<signal.h>
#include<sys/sem.h>
#include<poll.h>
#include<pthread.h>
#include<sys/select.h>
#include<sys/un.h>
#define SA (struct sockaddr*)
最佳答案
如果您想手动构建 IP header ,您必须将源地址设置为一个 IP,该 IP 可路由到您提供的作为目的地的 IP 地址。例如。对于本地主机,您可以将源设置为 127.0.0.1,因为本地主机“可以 ping”本地主机(即在那里具有可路由性)。
你给发送和接收的尺寸看起来真的太小了。我在我的家用电脑上进行了以下更改(它位于 NAT 设备后面,因此地址为 192.168.1.0/24)。
inet_pton (AF_INET, "192.168.1.168", &(ip_hdr->ip_src));
....
sendto (sfd, buf, sizeof(struct ip) + sizeof(struct icmphdr), 0, SA & addr, sizeof addr);
....
recvfrom (sfd, buff, sizeof(buff), 0, SA & addr2, &len);
thuovila@glx:~/src/so$ sudo ./a.out 128.214.248.132
hop limit:0 Address:192.168.1.1
hop limit:1 Address:192.168.1.1
hop limit:2 Address:91.156.128.1
hop limit:3 Address:139.97.9.58
hop limit:4 Address:139.97.6.209
hop limit:5 Address:139.97.6.250
hop limit:6 Address:193.110.224.14
hop limit:7 Address:193.166.255.93
Reached destination:128.214.248.132 with hop limit:8
关于c - 在 C 中使用 icmp 实现 traceroute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15458438/
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8年前关闭。 Improve this q
所以我对此有些疑惑。所有这些都在一个更大的公司网络中,但所有机器基本上都在现场。 我们有一台机器 (linux) 向另一台机器 (windows) 发送 SOAP 请求,几天后这些请求在一定时间后失败
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
tracert 返回请求的超时。我从中了解到的是数据包在网络上的某些地方丢失了。 这是否意味着问题出在 ISP 或托管服务提供商或我的 Windows 系统上? 10 * *
我正在尝试在 Python 2.6 中实现 UDP traceroute 解决方案,但我无法理解为什么我需要 root 权限来执行与我的操作系统附带的 traceroute 实用程序相同的操作。 这段
下面的示例输出是由traceroute转储的,我想使用pcre表达式来提取一些数据。 host-1 (1.1.1.1) 10.111 ms 20.222 ms host-2 (2.2.2.2)
Traceroute 是一个跟踪从 A 到 B 的路径的应用程序。(A 是您的位置,B 是您要跟踪的服务器)。 基本算法如下: send UDP with TTL = 1 Server A1 rece
在使用或者挑选VPS的过程中,我们常常会说到线路问题,去程的话好处理,直接在本地或者其他目标地点tracert服务器IP就可以,如果在服务器上测试回程路由的话,我们可能用到这个工具:tracero
我正在尝试获取 traceroute 失败时返回的错误消息。例如: from subprocess import CalledProcessError, check_output try: o
我想通过我的应用程序运行 traceroute 命令。 我该怎么做? Runtime.getRuntime().exec("traceroute google.com") 不工作。 java.io.I
为了完成我的硕士论文,我正在开发一种工具来测试和评估多路径网络的公式。 我将使用 traceroute 工具通过向它传递 -s 标志、源 IP 和目标 IP 来跟踪两个多宿主主机之间的网络。我有多个源
我试图找出使用 Traceroute 到达 google.com 需要多少跳。 Traceroute 的输出始终相同。我的命令:traceroute google.com输出: traceroute
假设我们对www.google.com进行traceroute,那么参数“max hops”将默认设置为30,因为我们没有指定它。 现在假设在找到 www.google.com 之前,tracerou
显然,ICMP 并不是创建 Traceroute 的唯一方法。 This和 this answer 表示可以发送低 TTL 的 UDP 数据包(或任何其他数据包)并等待 ICMP 消息。 我将如何在
我有一个用于 Unix 系统的 traceroute Python 程序,它打印出数据包从本地机器到达目的地所采用的路径——即数据包经过的路由器序列。问题是我得到的输出显示: traceroute t
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
好的,所以我尝试使用讲师提供的 Material 编写一个简单的 ICMP traceroute,这些 Material 是 echo_request 和 icmp_receive 程序,我想将它们合
根据 Wikipedia , 一个跟踪程序 Traceroute, by default, sends a sequence of User Datagram Protocol (UDP) packe
我正在尝试根据 traceroute 是否从特定 IP 地址获得响应来执行代码。所以: if traceroute 123.456.78.9 then option 1 else opti
这是我第一次提出任何问题,请原谅我的任何错误。 我想实现 traceroute 功能,就像 android play 商店中提供的这个应用程序一样。 Visual TracertPro Tracero
我是一名优秀的程序员,十分优秀!