2011-11-23 3 views
0

По причинам, которые я бы предпочел не делать (зависит от совместимости с сторонней библиотекой, которую я не могу изменить), мне нужно использовать сокет TCP для IPC в рамках одного процесса в iOS.Как определить PID однорангового TCP-соединения на одном устройстве iOS?

Чтобы предотвратить другие процессы, связанные с моим TCP-сокером IPC, я хотел бы проверить с ОС, что процесс, вызывающий connect() (из другого потока), имеет тот же PID, что и мой собственный.

О OS X Я заметил, что netstat не имеет этой информации (в отличие от других ОС, таких как Windows и Linux), и единственный способ, которым я смог определить эту информацию, - использовать lsof. Я не уверен, что может быть доступно в песочнице iOS, но пока мне кажется, что мой лучший выбор (даже если это кажется дорогим) заключается в том, чтобы выяснить, что делает lsof, и попытаться его воспроизвести.

Кто-нибудь знает о системном вызове, который я могу использовать, чтобы проверить это? Я уже прочитал getsockopt(2) и не вижу ничего, что применимо, и я не могу найти документацию о том, что поддерживает ioctl(2).

Что может быть возможно здесь?

+0

Невозможно сделать это с помощью API сокетов. Не можете ли вы использовать 'pipe (2)' вместо создания сокета? –

+0

'socketpair (2)' или 'unix (7)' может быть лучше подходит, чем 'pipe (2)', поскольку они фактически ведут себя как сокеты. – ephemient

+0

Да, верно, если вам абсолютно необходимо, чтобы накладные расходы tcp. –

ответ

1

Ничего себе, это звучит как ужасный API для библиотеки в процессе.

getpeername на принимающем конце должен соответствовать getsockname отправителя. Вы можете попытаться сопоставить его со всеми открытыми файлами в локальном процессе.

+0

Хорошая идея. Я думал об этом, но уволил эту идею, потому что думал, что возвращаемое «struct sockaddr» будет недостаточно. Но я забыл, что это, вероятно, будет 'sockaddr_in', который будет содержать поле' sin_port'. Теперь мне просто нужно выяснить, как определить, какие файловые дескрипторы действительны. (Я полагаю, что грубая сила может работать, но я бы предпочел получить список) – mpontillo

+0

Лучше всего я могу придумать, чтобы перебирать через 'getdtablesize()'. – mpontillo

+0

@Mike: 'getdtablesize()' даст вам верхний предел для грубой силы. FreeBSD 'fdescfs' может выставлять дескрипторы файлов (обычно на'/dev/fd/'), iOS? – ephemient

Смежные вопросы