如何在MacOS的内核上下文中的网络内核扩展(套接字过滤器)中获取本地端口和IP

时间:2018-02-21 16:21:06

标签: macos kernel-extension networkextension

我希望将连接套接字的端口和IP收集到网络内核扩展(NKE)中的套接字过滤器。

我尝试在sf_bind, sf_connect_in, sf_connect_out的{​​{1}}回拨函数中收集它。

struct sflt_filter回调中。它指定为sf_bind(void *cookie,socket_t so,const struct sockaddr *to) param"套接字的本地地址将绑定到"所以我使用了代码:

to

有时IP和端口都是空的,有时两者中的一个出现。

在我尝试使用代码的同一个和其他回调中:

printf("Local port:<%u> and IP<%04X>", 
        ntohs(((struct sockaddr_in *)to)->sin_port), 
        ntohs(((struct sockaddr_in*)to)->sin_addr.s_addr));

但是这段代码总是给IP和端口空。

有没有人有任何想法?还是另一种方式来获得它?提前谢谢。

1 个答案:

答案 0 :(得分:0)

关于你的第一个代码片段:如果没有完整的回调代码示例,很难说出什么是错误的,但是你应该定义检查&#34;到#34;的sa_family字段。在尝试将sin_port和sin_addr打印为port和ip之前。

我认为你要找的值是AF_INET和AF_INET6。

关于你的第二个代码片段:你应该再次检查sa_family;

另外,在&#34;上调用sock_getsockname&#34;在绑定回调可能是错误的,因为&#34;回调&#34;在相关操作之前被调用,你不会为#34;所以&#34;填充sockaddr。

tcplognke样本(曾经是Apple开发人员的资源,但他们并不擅长关注它们),你应该查看它们的例子。

有关于Apple计划制作NKE技术的信息deprecated soon,所以要小心使用它:)