2009-09-03 28 views
3

我在寫一個客戶端應用程序,它通過一個Unix域套接字連接到一個服務器進程。如果服務器進程沒有運行,我希望客戶端等待服務器啓動並且正在監聽套接字上的連接。等待一個Unix域套接字被綁定

目前我在客戶端有一個重試循環,每秒調用connect()直到成功連接到套接字。

是否有任何函數可以調用,直到創建一個特定的命名套接字(例如「/ var/mysock」)並將其綁定到服務器進程時,這些函數纔會被阻塞?

回答

2

不是一個完整的答案,但...

如果你在Linux中,inotify界面會讓你陷阱操作的前幾個有用的步驟:

  • unlink「荷蘭國際集團剩下的前套接字將觸發它上面的IN_DELETE_SELF
  • bind'ing將在父目錄上觸發IN_CREATE

不幸的是,服務器不是connect'能夠,直到它listen的。雖然這是下一個合乎邏輯的步驟,但它不能保證它馬上就能完成。它看起來好像inotify提供了一個接口。

+0

感謝您的有用建議 - 這絕對是一個開始。我需要能夠支持Solaris和Linux,儘管Solaris似乎有一個類似的功能叫做FAM。 – James 2009-09-04 01:41:57

1

我知道這是一個非常古老的問題,但這可能有助於新手通過Google來到這裏,並且遇到同樣的問題。

如果便攜性是一個問題,並且作爲一個指導原則,它應該始終如一,那麼您的行爲方式是完全正確的。有時候,明顯的解決方案也是正確的。如果您擔心如此頻繁地嘗試connect()的開銷,請在您的嘗試循環中改爲在套接字上執行stat(),如果可行,請使用來自stat.hS_ISSOCK()宏驗證它是否是套接字。只有這一次是真的,你纔會嘗試connect()

您唯一需要擔心的奇怪異步通知是如果客戶端應用程序可以或應該在等待服務器啓動時執行其他工作。這不是典型的,但我可以設想你可能想要這樣做的情況。在這種情況下,我只需在一個單獨的線程中嘗試連接。如果您認爲這樣做會很合適,我可以在這裏找到一些細微之處,但我認爲對於一個簡單的「等待服務器啓動」類型循環來說是過度的。