2010-04-20 243 views
2

我正在編寫一個應用程序,該應用程序分爲Mac OS X兩個部分 - 一個守護程序和一個代理程序。我使用標準的unix套接字在守護進程和代理之間進行通信。也就是說,套接字是用PF_UNIXSOCK_STREAM創建的。阻止unix域套接字的問題

當創建代理(每當用戶登錄時),它所做的第一件事情之一就是連接到套接字。這對第一個代理人來說似乎是完美的。但是,當第二個代理連接時,守護進程遇到以下問題:

我正在使用select()來檢查可以讀取的數據。調用成功,並指示有數據要讀取。然而,當我打電話recv()-1返回,並errno設置爲35,或現在"Resource temporarily unavailable".

,我希望這對於非阻塞套接字,但我有三重檢查 - 我從來沒有插座設置是非阻塞的。

據我所知,只有當第二個代理連接到相同的unix套接字時纔會發生這種情況。如果我只限於一個守護進程和一個代理,那麼一切似乎都完美無缺。什麼可能導致這種奇怪的行爲?

回答

2

這聽起來有點像你試圖從錯誤的客戶端讀取fd。沒有看到你的代碼很難說,但是從你的描述來看,這聽起來有點像。

所以,以防萬一,以下是它的工作原理。您的服務器結束時有三個文件描述符,它首先開始監聽的套接字,然後是每個連接的客戶端的一個文件描述符。當原始插座上有東西需要閱讀時,這意味着有一個新的客戶端;這聽起來像你有這部分權利。每個連接的客戶端都會爲您提供自己的獨立fd來讀取/寫入。如果的任何已準備好讀取,則將返回調用select()您必須使用FD_ISSET()從select中檢查readfds變量中的每個fd,以查看它是否確實有數據要讀取。

您可以看到這種類型的代碼here的一個基本示例。