2011-11-23 67 views
0

由于我不想涉及的原因(与无法更改的第三方库的兼容性),我需要使用TCP套接字在iOS中的单个进程中执行IPC。如何确定同一个iOS设备上的对等TCP连接的PID?

为了防止其他进程与我的TCP IPC套接字交谈,我想向操作系统证明,调用connect()(来自另一个线程)的进程与我自己的PID具有相同的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开销,则为true。 –

回答

1

哇,这听起来像一个可怕的API的进程内库。

getpeername在接收端应该匹配getsockname的发送端。您可以尝试将其与本地进程中的所有打开的fds进行匹配。

+0

好主意。我想这样做,但驳回了这个想法,因为我认为返回的'struct sockaddr'是不够的。但我忘了它可能是一个'sockaddr_in',它将包含一个'sin_port'字段。现在我只需要弄清楚如何确定哪些文件描述符是有效的。 (我认为蛮力可以工作,但我宁愿得到一个列表) – mpontillo

+0

目前为止,我可以想出的最好方法是遍历'getdtablesize()'。 – mpontillo

+0

@Mike:'getdtablesize()'会给你一个蛮力的上限。 FreeBSD的'fdescfs'可以暴露文件描述符(通常在'/ dev/fd /'),iOS吗? – ephemient

相关问题