Connection via routeur, erreur 10053

LePhiphou Messages postés 4 Date d'inscription jeudi 29 mai 2003 Statut Membre Dernière intervention 18 décembre 2007 - 18 déc. 2007 à 18:09
LePhiphou Messages postés 4 Date d'inscription jeudi 29 mai 2003 Statut Membre Dernière intervention 18 décembre 2007 - 18 déc. 2007 à 21:07
Bonjour à tous
J'ai créé un jeu de contrée (équivalent à la belote version sudiste ;-) qui réunit 4 clients autour d'un serveur. Tant que j'étais chez Free avec une IP fixe, ça marchait très bien. A présent, avec une NeufBox, ça ne passe plus.
J'ai fait une appli minimaliste de connexion Client/Serveur pour rechercher le pb. En local (IP 127.0.0.1), c'est ok. J'ai défini dans le NAT du routeur (neufbox) une règle pour dire que tout ce qui arrive sur le port 800 du routeur doit traverser jusqu'au port 800 de la machine 192.168.1.21 (qui fait client et serveur pour l'occasion).
Malheureusement, ca ne marche toujours pas !
Le WS2 (winsock serveur) se met bien en écoute, le WS1 (client) fait sa demande, le WS2 accepte le "requestID" dans la procédure ConnectionRequest puis il se met en erreur 10053 "La connexion s'est interompue suite à un délai d'attente dépassé....." Et le WS1 semble toujours en attente de connexion.
Voici l'appli :

Option Explicit


Private Sub Command1_Click()
    WS2.LocalPort = 800
    WS2.Listen
    Label2.Caption = Etat(WS2.State)
End Sub


Private Sub Command2_Click()
    WS1.RemotePort = 800
    WS1.RemoteHost = "77.196.49.122"
    WS1.Connect
    Label1.Caption = Etat(WS1.State)
End Sub




Private Sub WS1_Close()
Label1.Caption = Etat(WS1.State)
End Sub


Private Sub WS1_Connect()
Label1.Caption = Etat(WS1.State)
End Sub


Private Sub WS1_ConnectionRequest(ByVal requestID As Long)
Label1.Caption = Etat(WS1.State)
End Sub


Private Sub WS1_DataArrival(ByVal bytesTotal As Long)
Dim data As String
WS1.GetData data
MsgBox data
Label1.Caption = Etat(WS1.State)
End Sub


Private Sub WS1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)


Label1.Caption = Etat(WS1.State)
End Sub


Private Sub WS1_SendComplete()
Label1.Caption = Etat(WS1.State)
End Sub


Private Sub WS1_SendProgress(ByVal bytesSent As Long, ByVal bytesRemaining As Long)
Label1.Caption = Etat(WS1.State)
End Sub


Private Sub WS2_Close()
    Label2.Caption = Etat(WS2.State)
End Sub


Private Sub WS2_Connect()
Label2.Caption = Etat(WS2.State)
End Sub


Private Sub WS2_ConnectionRequest(ByVal requestID As Long)
    WS2.Close
    WS2.Accept requestID
    Label2.Caption = Etat(WS2.State)
End Sub


Private Sub WS2_DataArrival(ByVal bytesTotal As Long)
Dim data As String
WS2.GetData data
MsgBox data
Label2.Caption = Etat(WS2.State)
End Sub


Private Sub WS2_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
Label2.Caption = Etat(WS2.State)
End Sub


Private Sub WS2_SendComplete()
Label2.Caption = Etat(WS2.State)
End Sub


Private Sub WS2_SendProgress(ByVal bytesSent As Long, ByVal bytesRemaining As Long)
Label2.Caption = Etat(WS2.State)
End Sub



Private Function Etat(num As Integer)
Select Case num
    Case 0:  Etat = "fermé"
    Case 1:  Etat = "ouvert"
    Case 2:  Etat = "en écoute(hôte)"
    Case 3:  Etat = "connexion suspendue"
    Case 4: Etat = "recherche du serveur distant (client)"
    Case 5: Etat = "serveur distant trouvé"
    Case 6: Etat = "connexion en cours"
    Case 7:  Etat = "connecté"
    Case 8: Etat = "fin de connexion (souvent due à une erreur)"
    Case 9:  Etat = "erreur"
End Select
End Function

Merci à tous pour vos contributions...


Un sudiste en manque de contrée

3 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
18 déc. 2007 à 20:00
Salut
Tel que tu l'as écrit, le WS2 qui est en écoute au début accepte lui même la ConnectionRequest, donc il ne peut plus être en écoute ensuite puisqu'il est en dialogue avec celui qui l'a appelé.
Si tu veux pouvoir gérer plusieurs clients sur un même serveur, il faut créer un indexage de Winsock a qui tu confiera le soin de se connecter aux appels entrant afin de garder ton WS2 en écoute.

Charge et lis quelques sources de Chat sur le site : Ils utilisent cette technique d'indexation de Winsock.

Cela dit, concernant ton erreur, je pense qu'elle n'intervient qu'après avoir fait une première connexion (pour les raisons sitées ci-dessus)

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
18 déc. 2007 à 20:02
(*) "indexage" : aussi "indexation", "indexement"
Moi qui suit si pointilleux sur l'orthographe, je me lâche, là !
0
LePhiphou Messages postés 4 Date d'inscription jeudi 29 mai 2003 Statut Membre Dernière intervention 18 décembre 2007
18 déc. 2007 à 21:07
Salut Jack


Ici, je ne cherche pas à connecter plusieurs clients (je l'ai fait dans mon jeu avec un winsock d'écoute et le chargement d'autres winsock sur d'autres port une fois la connexion établie avec le joueur). 1 client <=> 1 serveur, les deux s'échangent par la suite des données : pas codé ici, je traite simplement de la connexion !


C'est bien le serveur qui accepte la ConnectionRequest ?!


PS: un s à "confiera" aussi
0
Rejoignez-nous