2013-06-20 51 views
3

我想開發主服務器和輔助服務器。服務器插座寬鬆綁定

當主服務器關閉時,輔助服務器應該位於相同的端口上。

但是,當主服務器準備好啓動輔助服務器時,應正常停止,以便主服務器可以在同一端口上啓動。

是否有任何方式輔助服務器可以知道另一個進程試圖在同一端口上啓動?

+2

誰投票把這個事件視爲「不是真正的問題」,只是表現出他們自己的無知。 –

+1

嗯,主機和從機服務器在_same_機器上?這是一個非常奇怪的設置 – fge

+0

編輯突出**特定的,真正的問題**被問到。 –

回答

3

如果你需要的是有你的服務器總是,你可以按照這個方法,

創建一個父進程,這將催生一個孩子被監聽的端口上做實際的服務。當孩子提供實際的請求時,父母會通過C中的waitpid等待孩子死亡(崩潰/狀態更改)。所以,每當孩子出現故障時,父母都會知道併產生新的過程。 - 首選方法


如果您需要在特定的主二次設計,

當二次正在服刑的請求,它可以隨時等待來自主服務器的信號。因此,當主設備啓動時,它的第一個任務是在發現輔助設備已啓動(通過pid文件或文件鎖定或綁定失敗)時將該信號發送到輔助設備,以便輔助設備可以優雅地關閉。

+0

有趣 - 如果輔助小學是小學的啓動家長,它可以使用類似sigchild的東西來判斷是否死亡? –

+1

與此類似。我個人設計的服務器有父母和孩子,父母只是在使用'sigchild'來監控孩子,並在它發生故障時產卵。 – VoidPointer

1

我不相信有一個直接的方式來檢測過程使用試圖聽一個給定的端口上,短攔截與調試鉤實際的嘗試,如ptrace的,或者更可能的共享庫替換LD_PRELOAD。

但是,如果您可以修改源代碼,則可以非常容易地讓一個進程通知另一個進程,並請求它輕鬆避開。您可以使用各種進程間通信方式來執行此操作,例如在它正在偵聽的端口上聯繫它(注意安全隱患),在不同的端口上聯繫它(僅偵聽回送接口!),在unix域中聯繫它套接字和許多其他選擇。

要知道另一個進程是否正在偵聽,您可以使用netstat或直接使用自/ proc導出的信息查看正在使用的套接字。

請注意,除非原始服務器使用了SO_REUSEADDR標誌,否則在不同的進程可能聲明該端口之前可能會遇到超時。這可能會爭論在備用端口上運行備份,並讓客戶端將其作爲備用端口進行嘗試。或者擁有一個簡單的進程,用作端口轉發器到兩個服務器的唯一端口。