【发布时间】:2014-10-01 12:19:30
【问题描述】:
我们有一个传统的 vb6 自动化应用程序,可以根据需要通过套接字进行通信。 但是打开和建立到远程端口的连接(仅在需要时)需要更多时间。
所以,我正计划编写其他应用程序(例如套接字服务器)来打开所需的套接字并保持连接处于活动状态。此应用程序会将连接的套接字句柄值写入文件或数据库。
是否可以在 vb6 中使用来自其他进程(本例中的套接字服务器应用程序)拥有的已打开套接字的套接字句柄创建套接字对象?
【问题讨论】:
我们有一个传统的 vb6 自动化应用程序,可以根据需要通过套接字进行通信。 但是打开和建立到远程端口的连接(仅在需要时)需要更多时间。
所以,我正计划编写其他应用程序(例如套接字服务器)来打开所需的套接字并保持连接处于活动状态。此应用程序会将连接的套接字句柄值写入文件或数据库。
是否可以在 vb6 中使用来自其他进程(本例中的套接字服务器应用程序)拥有的已打开套接字的套接字句柄创建套接字对象?
【问题讨论】:
这正是WSADuplicateSocket() 所针对的情况类型。
您的“服务器”可以创建一个套接字并使用WSADuplicateSocket() 填充描述该套接字的WSAPROTOCOL_INFO 记录。然后,“服务器”可以使用您想要的任何 IPC 机制将WSAPROTOCOL_INFO 公开给您的 VB 应用程序。 VB 应用程序可以将WSAPROTOCOL_INFO 传递给WSASocket() 以访问套接字并根据需要使用它。
【讨论】:
WSADuplicateSocket() 在 XP 上可用(DuplicateHandle() 可以在 Win2000 和更早版本上使用)。而VB6可以直接访问Winsock(见thevbzone.com/modWINSOCK.bas)。
WSADuplicateSocket 的其他信息,很高兴知道)。
不,Windows 套接字不能跨进程共享,甚至不能通过句柄继承(这是因为虽然它通常是句柄,但 LSP 可能返回不是句柄的东西,因此不会被继承)。您应该让一个进程打开并保持连接,而其他进程与该进程通信以与服务器通信。
【讨论】:
WSADuplicateSocket() 允许跨进程边界共享套接字。