macOS下运行无Boost的Asio ICMP Ping报Operation not permitted解决方法咨询
macOS下Asio Pinger免root运行方案
方案1:自定义适配协议(推荐,无需改Asio源码,无安全风险)
不要直接修改Asio官方的icmp.hpp头文件,单独定义符合Asio协议规范的自定义ICMP类适配macOS的非root权限要求:
- 定义自定义ICMP协议类
class icmp_macos { public: typedef asio::ip::basic_endpoint<icmp_macos> endpoint; typedef asio::basic_raw_socket<icmp_macos> socket; // 核心修改:用SOCK_DGRAM替代原始套接字的SOCK_RAW int type() const { return SOCK_DGRAM; } int protocol() const { return IPPROTO_ICMP; } int family() const { return AF_INET; } // 如需支持IPv6,额外添加family为AF_INET6的实现,protocol替换为IPPROTO_ICMPV6即可 };
- 替换现有代码中所有的
asio::ip::icmp类型为自定义的icmp_macos - 调整ICMP数据包构造逻辑:
SOCK_DGRAM类型的ICMP套接字由macOS内核自动填充ICMP校验和、标识符字段,无需手动构造完整ICMP头,仅需填充类型、代码、序号和payload部分即可,你之前修改头文件后发送崩溃就是因为沿用了原始套接字的完整包构造逻辑,包结构不符合SOCK_DGRAM套接字的要求。
方案2:设置二进制setuid权限(无需改代码,适合本地自用)
如果不想调整现有代码逻辑,可以给编译生成的二进制程序设置setuid权限,普通用户运行时会自动获得root权限,无需每次执行都输入sudo:
# 替换为你实际生成的程序路径 sudo chown root:wheel ./pinger sudo chmod u+s ./pinger
注意该方案存在安全风险,仅适合个人本地使用,不要分发带setuid权限的二进制文件。
内容的提问来源于stack exchange,提问作者JohnnyParafango
相关产品推荐
相关产品推荐

