2011-11-23 64 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

相關問題