Winsock TCPIP

cs_MicLau Messages postés 7 Date d'inscription lundi 24 mars 2003 Statut Membre Dernière intervention 10 octobre 2003 - 9 oct. 2003 à 13:40
blinnit Messages postés 18 Date d'inscription mardi 24 juin 2003 Statut Membre Dernière intervention 18 mars 2006 - 4 janv. 2005 à 22:01
Bonjour à vous tous,

Je rencontre un pb. avec Winsock et VB6. Je souhaiterai savoir si quelqu'un pouvait m'indiquer une solution ou une piste.

Voilà, j'ai développé une appli. VB (sur PC) qui dialogue avec un hôte (Vax développement en Fortran sous TCPIP).
Tout fonctionne bien. Les échanges de messages se passent très bien.

Mon problème survient lorsque j'arrête mon appli VB.
Si je la relance dans la foulée, je récupère l'erreur suivante :
Number : 10048
Description : Adresse en utilisation
Source : c:\winnt\system32\mswinsck.ocx

Cela donne l'impression que même après fermeture de l'application, le lien réseau est toujours en activité. Il faut que j'attende entre 3 et 5 minutes pour ne plus avoir cette erreur.

J'attends avec impatience vos lumières sur ce pb. gênant.

Merci.
SLTS. Laurent

5 réponses

man15372 Messages postés 20 Date d'inscription vendredi 31 janvier 2003 Statut Membre Dernière intervention 27 septembre 2004
9 oct. 2003 à 13:51
Supposons que ton ocx winsock s'appel wsk alors il faut procéder ainsi :

Avant d'etablir une connexion:

while wsk.state<>sckClosed
wsk.close
loop

ou alors cette solution plus simple :

if wsk.state<>sckClosed then wsk.close

Dans les 2 cas si ta connexion est encore active alors cela va la fermer.

Voila tu n'a plus qu'a essayer mais cela doit fonctionner.

man15372
0
cs_MicLau Messages postés 7 Date d'inscription lundi 24 mars 2003 Statut Membre Dernière intervention 10 octobre 2003
10 oct. 2003 à 11:13
Salut,

Je te remercie pour ta réponse.

Il s'avère que le Winsock est fermé au moment de la relance de l'application, mais quelque part l'état de la liaison est encore active.

Le lien IP entre les 2 machines restent actives et pour l'instant, je n'arrive pas à trouver pourquoi.

Par contre, si je ferme en 1er mon appli Fortran, je ne rencontre pas de pb. pour relancer mon appli Vb immédiatement.

Ca donne l'impression que Visual Basic ferme très mal les connexions TCPIP.

@+. Miclau
0
cs_MicLau Messages postés 7 Date d'inscription lundi 24 mars 2003 Statut Membre Dernière intervention 10 octobre 2003
10 oct. 2003 à 16:25
J'ai trouvé la solution.

Afin d'en faire profiter tout le monde, voilà la réponse :

Il suffit de mettre le "Local Port" du contrôle Winsock à 0. Par exemple : TcpClient.LocalPort = 0

Et cela avant le connect.

Référence Windows : http://support.microsoft.com/?kbid=173619

Voilà.
@+. Miclau.
0
kimmelf2 Messages postés 267 Date d'inscription lundi 22 septembre 2003 Statut Membre Dernière intervention 27 novembre 2005
11 nov. 2003 à 03:18
le principe du
if sck.state<>sckclosed then sck.close
est bon, mais il ne faut pas le mettre avant de se connecter mais au moment ou tu desire fermer le socket (en quittant l'appli, en cliquant sur un bouton ....)

au demarrage : tu as deja un socket qui tourne sur un port P. ton pgm cree un nouveau socket (donc differnet de celui qui a ete mal ferme) que tu initialise sur le meme port P.

etant donne que ce ne sont pas les meme socket, ca ne sert a rien de fermer le tien, c'est pas lui qui est ouvert

Il faut aussi que tu gere la deconnection par le poste distant :
private sub ton_sicket_close()
if ton_socket.starte<>sckclosed then ton_socket.close
end sub

car sinon, la connection est fermee de l'autre cote, mais toujours ouverte sur ton poste ce qui t'empeche -1- d'accepter une nouvelle connection (serveur) -2- de la reouvrir(client)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
blinnit Messages postés 18 Date d'inscription mardi 24 juin 2003 Statut Membre Dernière intervention 18 mars 2006
4 janv. 2005 à 22:01
le .close ne resout en rien ce problême.
En fait, il faut attendre 1 ou 2 minute avant de pouvoir utilisé le même port local, et je ne sais pas si ça vient de windows ou du serveur.
Alors la solution du "0" comme port est bien car elle attribue un port local different à chaque tentative de connection, mais ce n'est pas pratique pour certains routeurs et firewall.
Pour ma part, pour etre sure que ca marche chez tout le monde, j'utilise une tranche de port configurable et choisi en random avant chaque connection.
Exemple :

MinPort = 8000
MaxPort = 8000
Randomize
Winsock.LocalPort = (Rnd * Int((MaxPort - MinPort))) + MinPort
Winsock.Connect ...

Voila si ça peut aider...
0
Rejoignez-nous