3

我有以下情况:

  • iOS 上的两个应用程序(我的和第 3 方)需要通过 TCP/IP 进行通信
  • 我可以更改我的应用程序的代码,但不能更改第 3 方应用程序的代码
  • 协议无法更改(因为我无法更改第 3 方应用程序)。

在我的应用程序中,我想确保我与正确的应用程序交谈。

我知道如何使用geetpeername获取对等端口

我正在寻找的是一种找出使用此端口的进程的 pid 的方法。

我发现了类似的问题:How do you determine the PID of peer TCP connection on the same iOS device? 但是,在他的情况下,两个端口都在同一个应用程序中。

免责声明:我对私有 API 很好。它不会被发送到 AppStore。但是,我正在寻找非越狱手机的解决方案。

更新 1

我说我需要 PID,因为有已知的方法可以在 PID 和应用程序包 id 之间建立关联(使用 sysctl)。

一般来说,我不关心 PID 本身。我关心的是弄清楚套接字另一侧的应用程序是什么。

4

1 回答 1

3

我对此没有解决方案,但如果我要尝试这样做,我将按以下方式进行:

在 UNIX 系统上,您可以使用该lsof命令来确定哪些进程打开了哪些文件。这包括套接字,并lsof允许您确定使用给定端口的进程的 pid。例如,使用

lsof -n -P -i :443

如果您试图确定哪个进程正在使用端口 443 (HTTPS),这可能会产生(在 OS X 上):

COMMAND   PID  USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
firefox 81615 myname  112u  IPv4 0xffffff8017379a40      0t0  TCP 192.168.2.7:52521->74.125.28.103:443 (CLOSE_WAIT)

lsof我相信,达尔文的开源版本可以在这里找到。因此,您可以尝试从 main.c 开始,并使用这些命令行参数,浏览代码,直到找到使用的系统调用。

当在具有用户移动权限的进程中运行时,所需的调用当然有可能不起作用。但是,也许不是?如果源本身内部有安全检查lsof,那么如果您自己复制和粘贴源,您当然可以删除它。

无论如何,如果没有人提供另一个答案,它可能值得一试。

注意: lsof可用于越狱手机,我只是尝试运行 Cydia 提供的当前版本。在 5.1.1 或 6.1.2 上,它们对我不起作用。不知道为什么。我假设如果它们在存储库中,但是,在某些时候,有人能够移植lsof到 iOS。

于 2013-05-10T10:03:41.077 回答