Способ, которым я хотел бы сделать это, - это приложить ваше приложение к команде UNIX lsof
программно. lsof
перечисляет открытые «файлы», которые в системе BSD содержат сокеты, которые включают в себя сокеты TCP.
Раньше было, что Саурик опубликовал версию lsof
, которая была доступна на Cydia. К сожалению, я не смог заставить это работать недавно. Вы можете попробовать это самостоятельно, поскольку программное обеспечение от Saurik должно быть, как правило, заслуживающим доверия. Вы также можете попробовать составить исходный код lsof
самостоятельно, так как он доступен онлайн.
Однако, я нашел a discussion thread about this here. Пользователь Firewire888 смог получить домашнюю версию lsof
, работающую на iOS. Если вы доверяете своей работе, вы можете загрузить двоичный файл file here. За их инструкции:
- На Mac OSX скачать ldid для MacOSX. https://networkpx.googlecode.com/files/ldid
- О mac osx загрузить scaner's version of lsof in this thread. Еще раз спасибо!
- На Mac OSX перспективе
ldid -S lsof
- УПП или любыми средствами получить
lsof
к /usr/sbin/lsof
на iPhone (должен находиться в/USR/SBIN в противном случае получить ошибка не может раскошелиться)
Итак, вам нужно подделать код, который имеет версию lsof
, а затем установить его на свой iPhone по адресу /usr/sbin/lsof
.
Затем вы можете использовать частный API NSTask
(общедоступный на OS X) для запуска команды оболочки из своего приложения и захвата вывода.
Например, с помощью команды:
lsof -i4tcp
будут перечислены все порты IPv4 TCP.
В коде Objective-C, вы могли бы сделать это:
#include "NSTask.h"
- (void) listTcpPorts {
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath: @"/usr/sbin/lsof"];
[task setArguments: [[NSArray alloc] initWithObjects: @"-i4tcp", nil]];
NSPipe *pipe= [NSPipe pipe];
[task setStandardOutput: pipe];
NSFileHandle *file = [pipe fileHandleForReading];
[task launch];
NSData *data = [file readDataToEndOfFile];
NSString *output = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
NSLog(@"tcp ports: \n %@", output);
}
Это требует загрузки NSTask
заголовок, which you can find here.
, который дал мне стандартный вывод:
Sep 11 18:53:47 iPhone5 HelloJB[34535] <Warning>: tcp ports:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
apsd 143 mobile 9u IPv4 0x12345678 0t0 TCP 10.244.7.127:51216->17.172.238.202:5223 (ESTABLISHED)
apsd 143 mobile 10u IPv4 0x12345678 0t0 TCP 10.244.7.127:51215->17.149.37.18:5223 (ESTABLISHED)
apsd 143 mobile 12u IPv4 0x12345678 0t0 TCP 10.244.7.127:51215->17.149.37.18:5223 (ESTABLISHED)
apsd 143 mobile 14u IPv4 0x12345678 0t0 TCP 10.244.7.127:51216->17.172.238.202:5223 (ESTABLISHED)
dataacces 166 mobile 25u IPv4 0x12345678 0t0 TCP 10.244.7.127:51276->pc-in-f193.1e100.net:https (ESTABLISHED)
dataacces 166 mobile 27u IPv4 0x12345678 0t0 TCP 10.244.7.127:51276->pc-in-f193.1e100.net:https (ESTABLISHED)
afcd 26764 mobile 9u IPv4 0x12345678 0t0 TCP localhost:51284->localhost:51285 (ESTABLISHED)
MobileSaf 33165 mobile 11u IPv4 0x12345678 0t0 TCP 192.168.4.119:51349->stackoverflow.com:http (ESTABLISHED)
MobileSaf 33165 mobile 12u IPv4 0x12345678 0t0 TCP 192.168.4.119:51349->stackoverflow.com:http (ESTABLISHED)
Weather 33191 mobile 5u IPv4 0x12345678 0t0 TCP 192.168.4.119:50181->yts2.yql.vip.gq1.yahoo.com:http (LAST_ACK)
Weather 33191 mobile 7u IPv4 0x12345678 0t0 TCP 192.168.4.119:50182->yts2.yql.vip.gq1.yahoo.com:http (LAST_ACK)
Weather 33191 mobile 8u IPv4 0x12345678 0t0 TCP 192.168.4.119:50181->yts2.yql.vip.gq1.yahoo.com:http (LAST_ACK)
Weather 33191 mobile 10u IPv4 0x12345678 0t0 TCP 192.168.4.119:50182->yts2.yql.vip.gq1.yahoo.com:http (LAST_ACK)
notificat 33929 mobile 4u IPv4 0x12345678 0t0 TCP localhost:51295->localhost:51296 (ESTABLISHED)
notificat 33929 mobile 5u IPv4 0x12345678 0t0 TCP localhost:51301->localhost:51302 (ESTABLISHED)
notificat 33929 mobile 6u IPv4 0x12345678 0t0 TCP localhost:51318->localhost:51319 (ESTABLISHED)
notificat 33929 mobile 7u IPv4 0x12345678 0t0 TCP localhost:51330->localhost:51331 (ESTABLISHED)
syslog_re 34468 mobile 3u IPv4 0x12345678 0t0 TCP localhost:51321->localhost:51322 (ESTABLISHED)
Вы можете использовать различные параметры командной строки, и/или разобрать вывод, в соответствии с вашими потребностями. Удачи!
Я бы порекомендовал перефразировать ваш вопрос. Я прочитал его в первый раз и сделал предположение, что вы просто хотите получить список открытых портов в оболочке (что подразумевает, что это не вопрос разработки программного обеспечения). И только во втором чтении я заметил часть «сделать заявку». И похоже, что по крайней мере 4 человека сделали то же самое. –
@frankish: Я проголосовал за повторное открытие и поддержку. Я считаю ваш вопрос законным и интересным. –
@Nate: Черт .. Мне нужно больше читать комментарии. Я думал, что франкиш написал комментарий (а не вы). Я добавил еще немного подробностей к его вопросу. –