获取raw sockets需要root权限,tcp/udp没有, 所以我需要知道如何获取 udp 套接字和获取 icmp 数据。 编程语言是 C,操作系统是类 BSD。
(换句话说,我想写一个没有root权限的ping)
最佳答案
您可以在没有 root 权限的情况下编写 UDP ping。
When the IP_RECVERR option is enabled, all errors are stored in the socket error queue, and can be received by recvmsg(2) with the MSG_ERRQUEUE flag set.
我假设 forge&send 例程已经在 SOCK_DGRAM 套接字上实现。 然后,访问 ICMP 消息的源地址:
- 设置套接字选项以接收错误 (IP_RECVERR)
- 在错误队列 (MSG_ERRQUEUE) 上调用 recvmsg()
- 解析返回的结构(msghdr 和 iovec),它包含 ICMP 发布者的源地址。
关于c - 如何在 UNIX 上的 udp 套接字上获取 icmp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13087097/