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
Vous devez vous connecter pour publier un commentaire.
Après la regardant à nouveau le projet, il s'avère qu'un ancien développeur de définir la LocalPort propriété du contrôle de winsock à une valeur différente de zéro. Ce fut la prévention de la réutilisation du contrôle de winsock.
Mettre ce paramètre à zéro, de façon aléatoire un port local pour être sélectionné, ce qui permet le contrôle à être réutilisés.
Leçon apprise: quand on traite avec VB6 j'ai besoin de regarder les paramètres de propriété ainsi que le code source.
OriginalL'auteur Simon Elliott
J'ai remarqué un comportement erratique, lors de la fermeture du port. Je ne pouvais pas re-ouvrir le port avec cohérence. Le fix: ajout d'un DoEvents après la commande fermer.
OriginalL'auteur user10090164