用 C 语言编写基本的路由跟踪脚本
我必须编写一个 trceroute 脚本,但我不确定我的尝试是否正确。
现在我正在这样做(如果我做错了或笨拙,请纠正我):
- 得到一个 ip- 和 udpheader 的结构
- 一个校验和函数
- 打开 2 个套接字:一个用于在 SOCK_RAW 模式下发送 UDP 数据包(以操作ttl) 和一个用于接收来自路由器的 ICMP 应答。
- 使用 sendto() 发送 UDP 数据包
- 不知道如何接收和处理 ICMP 应答
有没有比使用 sock_raw 更舒适的方法来更改 TTL,因为我必须自己定义所有标头内容? 打开 ICMP sock 时,socket() 应该使用哪些参数? 如何接收ICMP应答?
I have to write a trceroute script but I'm not sure if my attempts are correct.
Right now I'm doing it like that (please correct me if I'm doing wrong or clumsy):
- Got an struct for ip- and udpheader
- A checksum function
- Opening 2 sockets: One for sending UDP-packets in SOCK_RAW mode (to manipulate ttl) and one to receive ICMP-answers from the routers.
- Using sendto() to send UDP packet
- Having no clue how to receive and process an ICMP answer
Are there any more comfortable ways to change the TTL than using sock_raw where I have to define all header stuff by myself?
What parameters should I use for socket() when opening ICMP sock?
How to receive the ICMP answer?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您的目标平台是什么?这是来自 OpenBSD 源代码的 BSD 风格:
在Linux上,我相信,您需要将
IP_RECVERR
和recvmsg(2)
与MSG_ERRQUEUE
一起使用,请参阅ip(7)
。What platform are you targeting? Here's a BSD flavor from OpenBSD source:
On Linux, I believe, you need to use
IP_RECVERR
andrecvmsg(2)
with theMSG_ERRQUEUE
, seeip(7)
.至于设置 TTL,您可以使用
setsockopt()
< /a>.以下是 Linux 上ping
iputils 源代码的摘录:As far as setting the TTL is concerned, you can use
setsockopt()
. Here's an extract from the iputils' source forping
on Linux:我遇到了同样的问题并解决了。
您需要
我将展示我的代码。
它可以在我的电脑上运行。 (Windows 10)
我电脑中的结果
I met the same problem and solved it.
You need to
I will show my code.
and it works on my computer. (Windows 10)
the result in my computer