Il est absolument nécessaire de fermer proprement la connexion Winsock. Toutefois, puisque nous sommes dans une application client/serveur et que le serveur ne nous appartient pas, c'est lui qui nous impose les règles de fermeture. La plupart du temps, une fois la requête du client satisfaite, la connexion rentre "en hibernation", dans laquelle elle reste pour une durée fixée par le serveur (
une dizaine de minute en général).
Le problème, c'est qu'une connexion en hibernation n'est pas fermée, et si on essaie de se reconnecter une deuxième fois avec la même application, on aura une erreur "Opération Invalide dans l'État Courant", ce qui est logique puisque la connexion n'est pas fermée.
De la même façon, une connexion Winsock utilise un port virtuel sur la machine (stockée, le temps de la connexion, dans la variable LocalPort). Et tant que la connexion n'est pas fermée, le port reste utilisé, ce qui signifie qu'il est impossible de le réutiliser pour une deuxième connexion.
Par conséquent la manière la plus propre de fermer une connexion Winsock, et aussi surprenant que ça puisse paraître, est de le faire avant d'appeler la procédure de connexion:
Winsock1.Close
Winsock1.LocalPort = 0
Winsock1.Connect hostname, 79
Ce code est une mesure de sécurité à respecter absolument
(sinon la connexion ne marchera qu'une seule fois et plantera à la deuxième, ce qui est assez embêtant).
Partager