2014-10-01 82 views
0

我們有一個傳統的vb6自動化應用程序,可根據需要通過套接字進行通信。 但是,打開並建立連接(只有在需要時)到遠程端口需要更多的時間。因此,我打算編寫其他應用程序(比如套接字服務器)來打開所需的套接字並保持連接活動。此應用程序將連接的套接字句柄值寫入文件或數據庫。重複使用套接字句柄

是否有可能在vb6中使用由其他進程擁有的已打開的套接字(本例中的套接字服務器應用程序)使用套接字句柄創建套接字對象?

回答

2

這正是WSADuplicateSocket()適用的情況。

您的「服務器」可以創建套接字並使用WSADuplicateSocket()來填充描述套接字的WSAPROTOCOL_INFO記錄。然後,「服務器」可以使用任何你想要的IPC機制將WSAPROTOCOL_INFO暴露給你的VB應用程序。 VB應用程序可以通過WSAPROTOCOL_INFOWSASocket()來訪問套接字並根據需要使用它。

+0

有趣的答案!不幸的是,API的操作系統要求最低,並且要求OP直接使用套接字API。鑑於語言是VB6我懷疑他們正在使用COM組件來訪問TCP/IP套接字。 – tcarvin 2014-10-02 12:40:58

+0

儘管MSDN聲稱,'WSADuplicateSocket()'在XP上可用(''DuplicateHandle()''可以在Win2000和更早版本上使用)。 VB6可以直接訪問Winsock(請參閱http://www.thevbzone.com/modWINSOCK.bas)。 – 2014-10-02 15:37:31

+0

哦,是的,我確定它可以。但我仍然認爲他們現在正在使用COM對象來執行它,並且轉換的努力可能比OP討論的要多。 (並感謝關於'WSADuplicateSocket'的更多信息,很好的瞭解)。 – tcarvin 2014-10-02 15:52:35

2

不,Windows套接字不能被跨進程共享,甚至不通過句柄繼承(這是因爲雖然它通常是一個句柄,但LSP可能會返回一些不是句柄,因此不會繼承的東西)。您應該打開一個進程並保持連接,其他進程與該進程通信以與服務器進行通信。

+0

這個怎麼樣:http://support2.microsoft.com/kb/150523 – wqw 2014-10-01 15:41:12

+0

@wqw:看到這個問題:http://stackoverflow.com/q/11847793/2101267 – 2014-10-01 16:25:35

+0

'WSADuplicateSocket()'允許共享套接字跨越流程邊界。 – 2014-10-02 01:17:18