我正在开发一个传统的VB6应用程序。该应用程序使用RAS API建立调制解调器连接,然后使用winsock控件连接到IP地址&港口。
我现在正在为此应用添加“故障转移”功能,如果它无法连接到服务器,它会尝试连接到列表中的下一个。
假设我有两台服务器,服务器应用程序A和服务器应用程序B.(在我的测试期间,我已经交换了这些服务器以验证两台服务器都是可访问的,并且没有路由/防火墙问题。)
如果我停止服务器应用程序A,那么当应用程序尝试连接到服务器应用程序A然后服务器应用程序B时会发生一些非常奇怪的事情:
mySocket.close
mySocket.Connect serverA, portA
(这似乎有点奇怪:我不确定为什么它似乎连接了一会儿。)
套接字保持在sckClosing状态。几百毫秒后,我继续尝试连接到服务器B:
mySocket.close
mySocket.Connect serverB, portB
此时如果我启动服务器应用程序A,执行RAShangup和RASdial,并尝试连接到服务器A,一切正常。
就像序列
一样socket.connect ip, port
socket.close
socket.connect newIP, newPort
除非插入RAShangup和RASdial,否则无法正常工作。相反,它失败了WSAETIMEDOUT。
关闭和连接通话之间有什么需要做的吗?
注意:我已经尝试确保关闭通话已经关闭,但这没有帮助:
Private Sub closeSocket(ByRef w As Winsock)
w.Close
Do While (w.State <> sckClosed)
DoEvents
Loop
End Sub
答案 0 :(得分:2)
再次查看该项目后,事实证明以前的开发人员将winsock控件的LocalPort属性设置为非零值。这阻止了winsock控件的重用。
将此设置为零会导致选择随机本地端口,从而允许重复使用该控件。
经验教训:在处理VB6时,我需要查看属性设置以及源代码。
答案 1 :(得分:-1)
关闭端口时,我注意到一些不稳定的行为。我无法一致地重新打开端口。解决方法:在关闭命令后添加DoEvents。