VB6 contrôle de winsock: fermeture d'une connexion et la connexion à un autre serveur

Je suis en train de travailler sur un héritage application VB6. L'application utilise l'API RAS pour établir une connexion modem, puis utilise un contrôle de winsock pour se connecter à une adresse IP & port.

Je suis maintenant l'ajout d'un "basculement" de la fonctionnalité de cette application, où si elle ne peut pas se connecter à un serveur, il essaie de se connecter à la suivante dans la liste.

Disons que j'ai deux serveurs, serveur d'application et Un serveur d'application B. (Lors de mes tests, j'ai échangé ces alentours pour vérifier que les deux serveurs sont accessibles et il n'y a pas de routage /problèmes de pare-feu.)

Si j'arrête le serveur d'application, puis quelque chose de très étrange se produit lorsque l'application tente de se connecter au serveur d'application et Un serveur d'application B:

mySocket.close
mySocket.Connect serverA, portA
  • mySocket.etat = 6 sckConnecting
  • socket événement de connexion est appelé
  • mySocket.etat = 7 sckConnected
  • mySocket.etat = 8 sckClosing

(ce qui semble un peu étrange: je ne sais pas pourquoi il semble se connecter pendant quelques instants.)

Le support reste en sckClosing état. Après quelques centaines de millisecondes-je passer à essayer de se connecter au serveur B:

mySocket.close
  • mySocket.etat = 0 sckClosed

.

mySocket.Connect serverB, portB
  • mySocket.etat = 6 sckConnecting
  • erreur de socket événement est appelé avec l'erreur 10060 (WSAETIMEDOUT)
  • mySocket.etat = 9 sckError

À ce point si je démarrer le serveur d'application, faire un RAShangup et un RASdial, et essayez de vous connecter à Un serveur, tout fonctionne OK.

C'est comme si la séquence

socket.connect ip, port
socket.close
socket.connect newIP, newPort

ne fonctionne pas correctement à moins d'un RAShangup et RASdial est inséré. Au lieu de cela, il échoue avec WSAETIMEDOUT.

Est-il quelque chose que je dois faire entre un proche et l'appel de connexion?

Note: j'ai essayé de faire assurez-vous que la fermeture d'appel a vraiment fermé, mais ce n'aide pas:

Private Sub closeSocket(ByRef w As Winsock)
  w.Close
  Do While (w.State <> sckClosed)
    DoEvents
  Loop
End Sub

OriginalL'auteur Simon Elliott | 2011-06-15