在Linux中打开RAW套接字,而不是超级用户

我必须写一个ping函数才能在Linux上运行。 语言是C ++,所以C也好。

在互联网上search并查看ping命令的源代码,事实certificate,我应该创build一个原始套接字

 icmp_sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); 

如果我运行我的应用程序而不是超级用户, socket函数返回-1即没有成功创build套接字。 如果我作为超级用户运行它,一切正常。

现在, ping命令确实创build了一个原始套接字,我可以在没有超级用户权限的情况下运行它。

我的问题是:我怎样才能授予我的应用程序创build一个原始套接字所需的所有权限,而不是由超级用户执行?

Solutions Collecting From Web of "在Linux中打开RAW套接字,而不是超级用户"

ping需要cap_net_raw功能来做到这一点,没有(其他)超级用户权限,你的程序也是如此。 跑

 setcap cap_net_raw+ep your_executable_file 

作为根,然后普通用户将能够使用该程序。

您可以使您的程序成为一个SUID命令,授予它有效的根权限,而不授予执行用户。 有关示例和解释,请参阅此处 。