我有一個多進程TCPServer,它可以根據客戶端的請求創建一個進程(子進程)(同時它正在監聽其他連接請求)。所以我有客戶端和服務器之間的1對1映射。 假設有一個客戶端崩潰了......是否有可能將它重新連接到同一個子服務器進程?換句話說......有可能恢復失敗的預存連接或重新連接嘗試創建新連接(然後一個新的子服務器進程)?謝謝...恢復相同的TCP連接
回答
如果沒有內部會話相關詳細信息(forkee)的一些知識,您必須對外部細節做出假設,以確定哪些遠程連接重新關聯哪些本地連接端點。
雖然你可以改變事物在你的應用程序中的工作方式。 Oracle SQL * Net在某些平臺上執行此操作(由於平臺限制)。
與TCPServer的初始連接導致分叉and then opens up a new listening socket
,發回重定向指令以連接到新的偵聽套接字&以識別詳細信息(以避免其他人連接並模擬原始連接器)。客戶端然後連接到新的套接字,並使用此套接字在斷開連接之前進行任何重新連接。
我在.NET平臺上做了一些非常類似於此的事情。如果每個連接都有獨特的內容(例如連接設備的IMEI,則可以這樣做)。您應該有一些全局的二維數組變量,結合使用ProcessID和IMEI。因此,當設備斷開連接,然後設備重新連接時,您只能在此陣列中搜索此IMEI,並且您擁有該設備的過程。你應該非常小心這個全局變量。
編輯: 我舉了一個獨特的標識符的例子。在我的情況下,這是設備的IMEI。在你的情況下,這可能是其他的東西,你知道它是獨一無二的。 我不得不這樣做,因爲我在設備斷開連接時遇到了很大的問題。每一個新設備都是新的連接,所以之後我的CPU使用率非常高。
好的,我明白了..所以,糾正我,如果我worng ...每一個新的連接到達,我必須控制之前,如果它是從以前連接的客戶端或如果是一個新的客戶端。在第一種情況下,我必須將先前的服務器子進程傳遞給套接字描述符?是否足以將連接恢復爲沒有發生的情況? – marco 2011-03-25 16:00:33
我不會傳遞到前一個過程,我寧願關閉舊過程。如果您已經接受了新的連接,而不是新的過程(在我的情況下就是這樣)。所以當你有一個新的連接(在新進程中接受)時,你需要在數組中搜索ID。如果你有這個ID,你就殺了這個進程,然後把這個新的ID和 – 2011-03-25 17:47:20
@Stefan一起添加到這個數組中。我可以建議你編輯一個答案,並將它們合併爲一個,刪除另一個?它使得更容易地按照您的答案端到端:) – Jeff 2011-03-25 19:15:30
- 1. 恢復TCP連接
- 2. 硬件斷開連接後的TCP恢復連接
- 3. 從丟失的TCP連接中恢復傳輸
- 4. 從「連接重置對等方」恢復Indy TCP客戶端
- 5. 通過相同的TCP連接不同的HTTP主機
- 6. 通過單個TCP連接複用多個TCP連接
- 7. 在同一個TCP連接
- 8. iphone - 連接恢復回調
- 9. RabbitMQ:連接恢復機制
- 10. 連接通知恢復NSOperationQueue
- 11. Akka使用相同的端口創建兩個Tcp連接
- 12. 通過相同的TCP連接發送文件和消息
- 13. 用戶控件使用與主窗體相同的TCP連接
- 14. 如何在Talend中恢復數據庫連接的恢復?
- 15. Highstock恢復爲相同顏色的列
- 16. 不同的TCP連接爲每個WebRequest.Create()
- 17. SocketIO +節點 - 恢復丟失的連接
- 18. 恢復未連接的表從ibdata1中
- 19. Objective-C的啓動/恢復WiFi連接
- 20. 如何恢復iPhone上的連接?
- 21. Java - TCP連接
- 22. TCP連接
- 23. iphone tcp連接
- 24. Java TCP連接
- 25. 壞TCP連接
- 26. MySQL TCP連接
- 27. LabView TCP連接
- 28. TCP/IP連接
- 29. TCP連接池
- 30. TCP/IP連接
坦克你們的快速反應...我的代碼是在C++和這種語言是強制性的...所以我必須在這種情況下找到一個解決方案... @ stefan你是什麼意思與IMEI?我明白這是一個univoque標識符的連接..但你能給我更多的細節? – marco 2011-03-25 12:49:16