你好,我想通过objective-c获取iPhone上所有TCP/UDP开放端口的状态列表,就像Linux上的netstat一样。你知道如何实现吗?或者有没有可以做到这一点的API?谢谢。
你好,我想通过objective-c获取iPhone上所有TCP/UDP开放端口的状态列表,就像Linux上的netstat一样。你知道如何实现吗?或者有没有可以做到这一点的API?谢谢。
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开始),因此您可以使用它们。