Ce port qui veut pas la fermer

dalian_gate Messages postés 5 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 27 février 2006 - 23 févr. 2006 à 23:40
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 27 févr. 2006 à 23:00
Je développe deux petites applications TCP en VB6 SP6, le client et le serveur.
Il n'ya pas de problème de connexion les applications fonctionnent bien, en tout cas la première fois, mais lorsque je ferme le client et je le réouvre, j'ai une erreur "Adresse en utilisation".

J'ai tout essayé le "Winsock1.Close" dans le unload de mon application, le "Localhost = 0",
Mais mon port reste ouvert (j'utilise fport pour voir ça).
Je doit attendre quelques minutes pour que mon port se ferme, donc je me pose des questions si c'est pas XP SP2 qui me fait de blagues .

Par contre le serveur ne me pose aucun problème lorsque je le ferme le client le détecte, le port se ferme, tout comme il faut.

Donc pitié aidé moi avant que je commence à débuguer à la Canadienne c'est à dire à la hache.

9 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
24 févr. 2006 à 01:12
salut,

copie tes codes d'évènement connectionrequest (serveur) et de tes évènements close (s & c) stp. et ton numéro de port aussi.
0
dalian_gate Messages postés 5 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 27 février 2006
24 févr. 2006 à 09:50
Le port client c'est le 8750 et le port serveur c'est le 8751 mais j'avais essayé avant 60000 et 60001.

Alors voici mon ConnectionRequest du serveur :
Private Sub JamSock_ConnectionRequest(ByVal requestID As Long)
' Fermeture du Socket si Ouvert
If JamSock.State <> sckClosed Then JamSock.Close
' Acquittement de la connexion
JamSock.Accept requestID
' Visualisation de la connexion
tbcommand.Text = "Connection"
End Sub

Et la le close du socket serveur, sachant que je veux que le serveur reste actif même si le client se connecte ainsi un nouveau client peut se connecter (serveur mono-client)
Private Sub JamSock_Close()
If JamSock.State <> 0 Then
JamSock.Close
End If
JamSock.Listen
End Sub

Et le close du socket client

Private Sub JamSock_Close()
' Logiciel en version Small
Call CLOSEJAM
End Sub

CLOSEJAM() : uniquement un redimensionnement de ma fenêtre principale

Et encore la le unload de ma fenêtre principale (la boucle do-loop à été mise par désespoir de cause, mais ça ne change rien) :
Private Sub Form_Unload(Cancel As Integer)
' Fermeture du port avant de sortir
Do
JamSock.Close
Loop While JamSock.State <> 0
End Sub

Mais je suis en train de me dire que c'est peut-être parce que le serveur laisse son port ouvert ??? non comme même pas ou sinon un autre client ne pourrait pas se connecter.

J'espère que j'ai tous mis et je te remercie si tu peux m'aider.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
24 févr. 2006 à 10:43
salut,

non pour le serveur c'est correct.

en fait ce qui est chiant dans le socket c'est que WSK.CLOSE et
WSK_CLOSE (procédure / évènement) ont le même nom mais ne font pas la
même chose.



pour mieux comprendre, tu peux poser un timer qui afficherait l'état de
ton socket. tu verrais alors que quand le serveur fait CLOSE
(commande), le CLOSE (évènement) client se déclenche sans pour autant
passer l'état à 0 - SckClosed.

tant que la connection serveur n'est pas réellement fermée (tangent
ici), alors l'état client est "en cours de fermeture" (6 ou 8 de
mémoire).



donc pour ton serveur, dans le doute, je mettrai :

Private Sub JamSock_Close()

If JamSock.State <> 0 Then

JamSock.Close

DoEvents 'donne la main au système (çà fait une "micro-pause"...)

End If

JamSock.Listen

End Sub





et la vraie erreur d'après moi est :

Private Sub JamSock_Close()

JamSock.Close 'sinon il reste "en cours"

DoEvents



' Logiciel en version Small

Call CLOSEJAM

End Sub



et pour tes UnLoad, ton test (boucle) est très bien. pareil tout de même... ajouter un DoEvents



tiens-nous au courant, @+

PCPT [AFCK]
0
dalian_gate Messages postés 5 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 27 février 2006
24 févr. 2006 à 12:49
J'ai tout essayé, c'est vrai qu'une petite pause avant de quitter le client était intéressante mais ça a rien changé.

En regardant de plus près je confirme c'est bien XP sp2 qui me fait des blagues puisque c'est "System" qui conserve le port ouvert.

Aussi j'ai lancé le serveur sur un autre poste et phénomène paranaormal lorsque j'établis une connexion client-serveur, je ferme le serveur et le port reste ouvert et c'est toujours sous XP sp2.

Donc là je comprend plus rien ( ou plutôt ça fait un bout de temps que je comprend plus rien), j'ai l'impression que le port ne s'ouvre uniquement lorsque je fait winsock.connect et le winsock.close ne fait rien au niveau du socket puisque il ne le ferme pas au niveau de l'OS.

Je soupsonne de plus en plus l'OS XP SP2. Dans le doute j'ai autorisé les ports 8750 et 8751 dans le firewall XP, mais ça ne fait rien.

A ce niveau je vois pas, ça doit être trop compliqué pour moi.

Donc si tu vois autre chose ça m'intéresse.
@+
0

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

Posez votre question
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
24 févr. 2006 à 13:07
umm.....

quand ton client se connecte, tu fais un close avant?



.close

'éventuellement DoEvents....

.connect "127.0.0.1", 8751
0
dalian_gate Messages postés 5 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 27 février 2006
24 févr. 2006 à 14:52
Non pas juste avant, au chargement de l'application uniquement, mais même avec ta modification ça ne change rien.

Je me demande si c'est pas le Winsock qui a un problème. Mais je crois pas ou sinon j'aurais vu plein de post à ce sujet et il y aurais eu des patchs.

J'ai vu que d'autres personnes avaient rencontrés le même problème que moi, mais ils n'avaient pas la solution.

Donc quoi que je fasse le socket du client reste ouvert quelques minutes après
la fermeture du programme.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
24 févr. 2006 à 15:03
quand j'utilise Winsock, tant en client qu'en serveur, toujours un close avant le connect.

le serveur fait toujours un close avant le accept.

en close (évènement), toujours un close (des 2 cotés)

et error (évènement), toujours un close (des 2 cotés)



jamais aucun souci.. mais je suis sous XP SP1.



essai une chose : met un 2e socket, et à la fermeture, lance le 2e en
écoute (donc rôle serveur) sur le port du premier socket, puis ferme
le. pour voir si le port est vraiment occupé... ou au pire, comme
connection par listen ou bind, ce socket fermera le port avant de
l'ouvrir...



à tenter... ^^
0
dalian_gate Messages postés 5 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 27 février 2006
27 févr. 2006 à 22:39
Bon après ce week end reposant, je me suis repenché sur ce problème en essayant ce que tu m'as dit, mais ça change rien le port reste ouvert 2 min à partir de la fermeture du programme quoi que je fasse.

Donc ça restera un mystère non résolu, heureusement que c'est pour un développement interne pour une application de test.

Merci comme même de ton aide .
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
27 févr. 2006 à 23:00
umm....

pour essayer encore :

ton JamSock en groupe. il devient donc JamSock(0).

au load tu charges dynamiquement : Load JamSock(1). et tu le détruis à la fermuture, puis reload... non?

sinon depuis, j'ai lu sur le Forum aussi quelqu'un qui avait des soucis de compatibilité de projet suite au SP2 ....

pas de solution pour autant, mais c'est bon parfois de ne pas se sentir seul ^^
0
Rejoignez-nous