2011-03-25 34 views
1

我有一個多進程TCPServer,它可以根據客戶端的請求創建一個進程(子進程)(同時它正在監聽其他連接請求)。所以我有客戶端和服務器之間的1對1映射。 假設有一個客戶端崩潰了......是否有可能將它重新連接到同一個子服務器進程?換句話說......有可能恢復失敗的預存連接或重新連接嘗試創建新連接(然後一個新的子服務器進程)?謝謝...恢復相同的TCP連接

回答

2

如果沒有內部會話相關詳細信息(forkee)的一些知識,您必須對外部細節做出假設,以確定哪些遠程連接重新關聯哪些本地連接端點。

雖然你可以改變事物在你的應用程序中的工作方式。 Oracle SQL * Net在某些平臺上執行此操作(由於平臺限制)。

與TCPServer的初始連接導致分叉and then opens up a new listening socket,發回重定向指令以連接到新的偵聽套接字&以識別詳細信息(以避免其他人連接並模擬原始連接器)。客戶端然後連接到新的套接字,並使用此套接字在斷開連接之前進行任何重新連接。

+0

坦克你們的快速反應...我的代碼是在C++和這種語言是強制性的...所以我必須在這種情況下找到一個解決方案... @ stefan你是什麼意思與IMEI?我明白這是一個univoque標識符的連接..但你能給我更多的細節? – marco 2011-03-25 12:49:16

0

我在.NET平臺上做了一些非常類似於此的事情。如果每個連接都有獨特的內容(例如連接設備的IMEI,則可以這樣做)。您應該有一些全局的二維數組變量,結合使用ProcessID和IMEI。因此,當設備斷開連接,然後設備重新連接時,您只能在此陣列中搜索此IMEI,並且您擁有該設備的過程。你應該非常小心這個全局變量。

編輯: 我舉了一個獨特的標識符的例子。在我的情況下,這是設備的IMEI。在你的情況下,這可能是其他的東西,你知道它是獨一無二的。 我不得不這樣做,因爲我在設備斷開連接時遇到了很大的問題。每一個新設備都是新的連接,所以之後我的CPU使用率非常高。

+0

好的,我明白了..所以,糾正我,如果我worng ...每一個新的連接到達,我必須控制之前,如果它是從以前連接的客戶端或如果是一個新的客戶端。在第一種情況下,我必須將先前的服務器子進程傳遞給套接字描述符?是否足以將連接恢復爲沒有發生的情況? – marco 2011-03-25 16:00:33

+0

我不會傳遞到前一個過程,我寧願關閉舊過程。如果您已經接受了新的連接,而不是新的過程(在我的情況下就是這樣)。所以當你有一個新的連接(在新進程中接受)時,你需要在數組中搜索ID。如果你有這個ID,你就殺了這個進程,然後把這個新的ID和 – 2011-03-25 17:47:20

+0

@Stefan一起添加到這個數組中。我可以建議你編輯一個答案,並將它們合併爲一個,刪除另一個?它使得更容易地按照您的答案端到端:) – Jeff 2011-03-25 19:15:30