0

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

我试图sf_bind, sf_connect_in, sf_connect_outstruct sflt_filter.

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

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

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

在相同的回调和其他回调中,我尝试过使用代码:

unsigned char szAddrStr[256];
struct sockaddr_in addrLcl;
sock_getsockname(so, (struct sockaddr *)&addrLcl, sizeof(addrLcl));
inet_ntop(AF_INET, &addrLcl.sin_addr, (char *)szAddrStr, sizeof(szAddrStr));
printf("IP String <%s> Port Hex:<%X>", szAddrStr, ntohs(addrLcl.sin_port));

但是这段代码总是将 IP 和端口设为空。

有人知道吗?或其他方式得到它?提前致谢。

4

1 回答 1

0

关于您的第一个代码片段:如果没有完整的回调代码示例,很难说到底出了什么问题,但是您绝对应该在尝试将 sin_port 和 sin_addr 打印为端口和 ip 之前检查“to”的 sa_family 字段。

我认为您正在寻找的值是 AF_INET 和 AF_INET6。

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

此外,在绑定回调中对“so”调用 sock_getsockname 可能是错误的,因为在相关操作之前调用了“回调”,并且您不会为“so”填充 sockaddr。

tcplognke示例(它曾经在苹果开发人员资源上,但他们不擅长关心它们),您应该查看它以获取示例。

并且有一条关于 Apple 计划很快弃用NKE 技术的信息,所以要小心使用它:)

于 2018-03-02T11:44:37.180 回答