2011-01-05 55 views
6

我目前有一個.NET程序啓動到服務器的連接並啓動另一個非託管可執行文件。本地進程應接管相同的套接字(在子進程終止之前,連接不被關閉是非常重要的!),並開始與服務器進行通信。從.NET傳遞到非託管子進程的套接字句柄

上述程序在Windows上運行,但我更喜歡一個解決方案,不涉及.NET部分的P/Invoke。作爲一個方面說明,從父母到孩子的溝通過程不是問題,所以我可以輕鬆地在兩者之間共享數據。此外,一旦我開始使用本地進程的套接字,我不再需要從.NET進程使用它,.NET進程在我完成從非託管進程使用套接字之前終止,因此,我需要知道如何處理.NET中的Socket對象,以便它的處理不會影響操作系統套接字及其可用性。

在此先感謝!

+1

請參閱此處的示例[Socket Duplication - Part 2](http://blogs.msdn.com/b/malarch/archive/2005/12/26/507461.aspx) – lsalamon 2011-08-09 15:22:43

回答

4

.NET 2.0及更高版本提供了方便的方法DuplicateAndClose

更新:看起來像一個黑客將需要找出在SocketInformation.ProtocolInformation目標套接字的存儲位置(在哪個偏移量)。這可以通過捕獲源進程中的字節數組,然後在另一個.NET進程中重新創建一個套接字並在那裏獲取套接字句柄(在第二個進程中)來完成。然後查看數據在字節數組中的位置。

此外還有一個很好的非託管方式來複制套接字,described here

+0

Mayevski'EldoS:MSDN說:'The目標進程應該使用Socket創建重複套接字實例。對於非託管進程,我認爲這是不可能的。 – 2011-01-05 13:36:58

+0

@sad_man你是對的。還有一個選項,我已包含在更新中。 – 2011-01-05 13:55:27

+0

感謝您指向我DuplicateAndClose。我已經寫了一些非常髒的代碼使用P/Invoke調用WSADuplicateSocket,但它看起來像它會做的伎倆,現在:) – em70 2011-01-06 10:49:20

0

我認爲由.NET Socket類創建的套接字句柄在默認情況下是可繼承的。 IIRC如果您使用Process.StartProcessStartInfo.UseShellExecute = false(ShellExecute不允許句柄繼承)產生子進程,您的子進程應該已經繼承套接字句柄。您是否嘗試將Socket.Handle傳遞給子進程並在那裏使用它?而我認爲只要子進程擁有繼承的句柄,套接字保持打開,即使創建它的過程消失了。 (我從來沒有直接使用過這個,但是我曾經有過這種行爲導致的一個錯誤。)然而,套接字可能已經被FILE_FLAG_OVERLAPPED等標誌打開了,你必須使用正確的函數組合來訪問它。

相關問題