如何在UNIX上获取umpp套接字上的icmp

时间:2012-10-26 12:40:30

标签: c unix udp ping icmp

获取原始套接字需要root权限,tcp / udp没有, 所以我需要知道如何获取udp套接字并获取icmp数据。 编程语言是C,OS类似于BSD。

(换句话说,我想写一个没有root权限的ping)

3 个答案:

答案 0 :(得分:1)

您可以在没有root权限的情况下编写UDP ping。

  

启用 IP_RECVERR 选项后​​,所有错误都会存储在   套接字错误队列,可以通过 recvmsg (2)接收    MSG_ERRQUEUE 标志设置。

See the UDP manual.

我认为forge& send例程已在SOCK_DGRAM套接字上实现。 然后,访问ICMP消息的源地址:

  • 设置套接字选项以接收错误(IP_RECVERR)
  • 在错误队列上调用recvmsg()(MSG_ERRQUEUE)
  • 解析返回的结构(msghdr和iovec),它包含ICMP发布者的源地址。

答案 1 :(得分:0)

UDP是OSI第四层协议,ICMP也是如此。因此,您无法在UDP套接字上实现ICMP,因为其第四层协议已经固定到UDP。您可以考虑编写一个需要特权来打开原始套接字的实现。然后,您可以为应用程序或您的帐户提供正确的功能,也可以将可执行文件SUID位翻转以使其以root用户身份运行。

答案 2 :(得分:-2)

所以,呃,绕过这个要求是微不足道的,你觉得它还会存在吗?

它意味着提供一些安全性,所以它不是非常容易的。

我不认为可以做到。