如何使用Objective-C在iPhone上获取TCP/UDP开放端口列表?

4

你好,我想通过objective-c获取iPhone上所有TCP/UDP开放端口的状态列表,就像Linux上的netstat一样。你知道如何实现吗?或者有没有可以做到这一点的API?谢谢。


可能是重复的问题:如何在iOS 4中列出TCP/UDP连接 - cHao
您可以获取iPhone上打开的TCP/UDP端口连接列表,无需越狱。不需要应用程序被拒绝在应用商店。请查看此答案:这里 - virata
2个回答

5
你无法在iPhone上运行netstat(除非越狱),但你可以做netstat所做的事情。查看《netstat》源代码中的protopr函数。我验证了你可以使用"net.inet.tcp.pcblist"作为名称调用sysctlbyname并获得一堆数据。我没有像netstat那样尝试解释数据。

测试用例:

size_t len = 0;
if (sysctlbyname("net.inet.tcp.pcblist", 0, &len, 0, 0) < 0) {
    perror("sysctlbyname");
} else {
    char *buf = malloc(len);
    sysctlbyname("net.inet.tcp.pcblist", buf, &len, 0, 0);
    NSData *data = [NSData dataWithBytesNoCopy:buf length:len];
    NSLog(@"data = %@", data);
}

在我的运行iOS 5.0的iPad 2上输出:

2011-11-17 19:59:34.712 keyboardtest[29423:707] data = <18000000 2c000000 9e2a0900
00000000 c60e5d00 00000000 0c020000 00000000 00000000 00000000 00000000 d4d3d4d2
00000000 00000000 ...

我截取了很多内容,请确保您将len初始化为0。此外,您不能像处理C字符串一样,只是将buf的内容放入NSString中。它不是C字符串,而是二进制数据,您需要解释它,就像netstat一样。

您可能希望解释数据。您需要阅读上面链接的netstat源代码中的protopr函数。由protopr使用的数据结构在<netinet/in_pcb.h><netinet/tcp_var.h>和其他头文件中声明在/usr/include/netinet中。这些头文件包含在iOS SDK中(至少从iOS 7.0开始),因此您可以使用它们。


你好:我使用以下代码,但没有输出, size_t size; sysctlbyname("net.inet.tcp.pcblist", NULL, &size, NULL, 0); char *port = malloc(size); sysctlbyname("net.inet.tcp.pcblist", port, &size, NULL, 0); NSString *portList = [NSString stringWithCString:port]; free(port); NSLog(@"%@",portList); - chao
谢谢!有关于如何解释它的任何线索吗? - Sunkas

4
为了使得Rob Mayoff的回答中获取到的数据易于阅读,你只需要查看inet.c的代码即可。在其中,你可以找到解析数据所需的所有内容。
请查看我在Hisenberg问题中的另一个回答:iPhone上的网络活动监控
在我的代码中,你可以看到数据可读的部分,即当我向字典中添加值时。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接