VB6 winsock控件:关闭连接并连接到另一台服务器

时间:2011-06-15 10:02:29

标签: vb6 winsock

我正在开发一个传统的VB6应用程序。该应用程序使用RAS API建立调制解调器连接,然后使用winsock控件连接到IP地址&港口。

我现在正在为此应用添加“故障转移”功能,如果它无法连接到服务器,它会尝试连接到列表中的下一个。

假设我有两台服务器,服务器应用程序A和服务器应用程序B.(在我的测试期间,我已经交换了这些服务器以验证两台服务器都是可访问的,并且没有路由/防火墙问题。)

如果我停止服务器应用程序A,那么当应用程序尝试连接到服务器应用程序A然后服务器应用程序B时会发生一些非常奇怪的事情:

mySocket.close
mySocket.Connect serverA, portA
  • mySocket.state = 6 sckConnecting
  • 称为套接字连接事件
  • mySocket.state = 7 sckConnected
  • mySocket.state = 8 sckClosing

(这似乎有点奇怪:我不确定为什么它似乎连接了一会儿。)

套接字保持在sckClosing状态。几百毫秒后,我继续尝试连接到服务器B:

mySocket.close
  • mySocket.state = 0 sckClosed

mySocket.Connect serverB, portB
  • mySocket.state = 6 sckConnecting
  • 调用套接字错误事件,错误10060(WSAETIMEDOUT)
  • mySocket.state = 9 sckError

此时如果我启动服务器应用程序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

2 个答案:

答案 0 :(得分:2)

再次查看该项目后,事实证明以前的开发人员将winsock控件的LocalPort属性设置为非零值。这阻止了winsock控件的重用。

将此设置为零会导致选择随机本地端口,从而允许重复使用该控件。

经验教训:在处理VB6时,我需要查看属性设置以及源代码。

答案 1 :(得分:-1)

关闭端口时,我注意到一些不稳定的行为。我无法一致地重新打开端口。解决方法:在关闭命令后添加DoEvents。