如何确定同一iOS设备上对等TCP连接的PID?
出于我不想讨论的原因(与我无法更改的第三方库的兼容性有关),我需要使用TCP套接字在iOS中的单个进程内执行IPC 为了防止其他进程与我的TCP IPC套接字通信,我想用操作系统验证调用如何确定同一iOS设备上对等TCP连接的PID?,c,ios,tcp,sockets,C,Ios,Tcp,Sockets,出于我不想讨论的原因(与我无法更改的第三方库的兼容性有关),我需要使用TCP套接字在iOS中的单个进程内执行IPC 为了防止其他进程与我的TCP IPC套接字通信,我想用操作系统验证调用connect()(从另一个线程)的进程是否与我自己的进程具有相同的PID 在OSX上,我注意到netstat没有此信息(与Windows和Linux等其他操作系统不同),我能够确定此信息的唯一方法是使用lsof。我不确定iOS沙盒中可能有什么可用的功能,但到目前为止,我的最佳选择(尽管它似乎很昂贵)似乎是找出l
connect()
(从另一个线程)的进程是否与我自己的进程具有相同的PID
在OSX上,我注意到netstat
没有此信息(与Windows和Linux等其他操作系统不同),我能够确定此信息的唯一方法是使用lsof
。我不确定iOS沙盒中可能有什么可用的功能,但到目前为止,我的最佳选择(尽管它似乎很昂贵)似乎是找出lsof
在做什么,并尝试复制它
有人知道我可以使用系统调用来检查这个吗?我已经通读了getsockopt(2)
,没有看到任何适用的内容,也找不到关于支持什么ioctl(2)
调用的文档
这里可能有什么呢?哇,对于进程内库来说,这听起来像是一个糟糕的API
接收端的
getpeername
应与发送端的getsockname
匹配。您可以尝试将其与本地进程中所有打开的FD匹配。使用sockets API无法做到这一点。你不能用pipe(2)
来代替创建套接字吗?socketpair(2)
或unix(7)
可能比pipe(2)
更合适,因为它们实际上的行为类似于套接字。是的,如果你绝对需要tcp开销,这是真的。我完全同意你们两个。如果是我自己设计的,我会使用管道或本地插座。不幸的是,这不是一个选项。@Mike:你找到这个问题的解决方案了吗?我也面临着同样的问题,而你是我的DenverCoder9():)好主意。我曾想过这样做,但放弃了这个想法,因为我认为返回的struct sockaddr
是不够的。但我忘了它可能是sockaddr\u in
中的一个sin\u port
字段。现在我只需要弄清楚如何确定哪些文件描述符是有效的。(我想蛮力可以奏效,但我更愿意得到一个列表)到目前为止,我能想到的最好办法是迭代getdtablesize()
@Mike:getdtablesize()
会给你一个蛮力的上限。FreeBSD的fdescf
可以公开文件描述符(通常位于/dev/fd/
),iOS可以吗?谢谢你的指针/dev/fd/*
确实可以在OSX上使用,因此它很有可能在iOS上使用。我会检查的。@Mike:用很多打开的FD再检查一遍。如果没有fdescfs
,FreeBSD的devfs
仅显示/dev/fd/[0-2]
。