I'm working on a legacy VB6 app. The app uses the RAS API to establish a modem connection, then uses a winsock control to connect to an IP address & port.
I'm now adding a "failover" feature to this app where if it can't connect to a server, it tries to connect to the next one in the list.
Let's say I have two servers, server app A and server app B. (During my tests I've swapped these around to verify that both servers are accessible and there are no routing / firewall issues.)
If I stop server app A, then something quite strange happens when the app tries to connect to server app A and then server app B:
mySocket.close
mySocket.Connect serverA, portA
- mySocket.state = 6 sckConnecting
- socket connect event is called
- mySocket.state = 7 sckConnected
- mySocket.state = 8 sckClosing
(which seems slightly odd: I'm not sure why it appears to connect for a few moments.)
The socket remains in sckClosing state. After a few hundred milliseconds I move on to try to connect to server B:
mySocket.close
- mySocket.state = 0 sckClosed
.
mySocket.Connect serverB, portB
- mySocket.state = 6 sckConnecting
- socket error event is called with error 10060 (WSAETIMEDOUT)
- mySocket.state = 9 sckError
At this point if I start server app A, do a RAShangup and a RASdial, and try to connect to server A, all works OK.
It's as if the sequence
socket.connect ip, port
socket.close
socket.connect newIP, newPort
doesn't work properly unless a RAShangup and RASdial is inserted. Instead it fails with WSAETIMEDOUT.
Is there anything I need to do between a close and connect call?
Note: I've tried making sure that the close call has really closed, but this doesn't help:
Private Sub closeSocket(ByRef w As Winsock)
w.Close
Do While (w.State <> sckClosed)
DoEvents
Loop
End Sub