IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Discussion :

Double socket , probléme de déconnexion


Sujet :

Développement

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    204
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 204
    Points : 48
    Points
    48
    Par défaut Double socket , probléme de déconnexion
    Bonjour,

    Il y a quelque chose que je ne comprend pas,
    j'ai conçu un projet Client/Server , et
    le programme client utilise 2 sockets TCP (un pour les requete distante) , l'autre pour les messages (message administratives,message arret serveur,message deconnexion). Le programme client se connecte 2 fois et meme port pour avoir 2 sockets.

    Ce que je ne comprend pas Winsock retourne au niveau du serveur une erreur comme quoi le socket distance à été déconnecté et que ce n'est pas le cas.

    Pourtant les 2 sockets sont en mode keep-alive au client et serveur.
    Dans le programme client j'utilise ioctlsocket et recv pour recevoir les données et au serveur j'utilise wsaasyncselect.

    Programme client :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    int connectserver(char* host)
    {
    	sockaddr_in skaddr;
    	tv.tv_sec = 30000;  /* 30 Secs Timeout */
    	int hsocket;
    	hsocket=socket(Internet,Stream,0);
    	if (hsocket!=-1)
    	{
    		ZeroMemory(&skaddr,sizeof(skaddr));
    		skaddr.sin_family=Internet;
    		skaddr.sin_port=swap(1002);
    		unsigned long l=HostToLong(host);
    		skaddr.sin_addr.S_un.S_addr=l;
    		if (connect(hsocket,(sockaddr*)&skaddr,sizeof skaddr)!=0)
    		{
    			closesocket(hsocket);
     
    			return 0;
    		}
     
    		setsockopt(hsocket, SOL_SOCKET, SO_RCVTIMEO,(const char*)&tv,sizeof(struct timeval));
    		setsockopt(hsocket, SOL_SOCKET, SO_SNDTIMEO,(const char*)&tv,sizeof(struct timeval));
     
    		BOOL bOptVal = TRUE;
      int bOptLen = sizeof(BOOL);
      int iOptVal;
      int iOptLen = sizeof(int);
      setsockopt(hsocket, SOL_SOCKET, SO_KEEPALIVE, (char*)&bOptVal, bOptLen);
     
     
    		return hsocket;
    	}
    	return 0;
    }

    Programme serveur en Pascal
    Code Pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     case msg.lParam of
         FD_ACCEPT: begin
               // log('Demande de connexion');
                //if (nombreconnection+1<=nombreconnectionmax) then begin
    //                 inc(nombreconnection);
                    scknew :=  accept(msg.wparam,0,0);
                    setcode(scknew,$4555);
                    i := getcode(scknew);;
                   // sendbuf(msg.wparam,@i,2);
                    WSAASyncSelect(scknew,principale.Handle,WM_USER,FD_CLOSE or FD_CONNECT or FD_ACCEPT or FD_READ);
                    tv.tv_sec := 5000;
                    tv.tv_usec := 500;
                    setsockopt(scknew, SOL_SOCKET, SO_RCVTIMEO,@tv,sizeof(tv));
    		            setsockopt(scknew, SOL_SOCKET, SO_SNDTIMEO,@tv,sizeof(tv));
                    bk := true;
                    setsockopt(scknew, SOL_SOCKET, SO_KEEPALIVE, @bk, 1);
                //end else
                //  closesocket(msg.WParam);
     
     
                    end;
         FD_CONNECT:begin
                   // nombreconnection := nombreconnection;
     
                    end;

    Je ne comprend pas pourquoi ca deconnecte au niveau du client pourtant je ne ferme pas le socket.

    Merci de votre aide.

  2. #2
    Membre confirmé
    Avatar de Mindiell
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 735
    Points : 546
    Points
    546
    Par défaut
    Citation Envoyé par sivaller Voir le message
    le programme client utilise 2 sockets TCP (un pour les requete distante) , l'autre pour les messages (message administratives,message arret serveur,message deconnexion). Le programme client se connecte 2 fois et meme port pour avoir 2 sockets.
    Tu te connectes 2 fosi sur le même port ? Si j'ai bein comprsi alors c'est normal. Un port c'est comme un téléphone, il ne peut être utilisé que par une personne (socket) à la fois.
    Dans ton cas, la deuxième connexion ferme la première, puis se connecte.

    Il vaut mieux utiliser 2 ports différents, et donc 2 sockets, bien sur.

    Voilà,

    PS: Si j'ai mal compris, essaye de re-expliquer plus clairement alors

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    204
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 204
    Points : 48
    Points
    48
    Par défaut On peux se connecter 2 fois du client sur le meme port
    L'erreur "Socket déconnecté par l'hote distant" est aléatoire.

    On peux se connecter 2 fois sur le meme port du client ça ne deconnecte pas l'autre , (parfois si aléatoirement)

    Par contre on ne peux lister au programme serveur 2 sockets à la fois du meme port.

  4. #4
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    Citation Envoyé par Mindiell Voir le message
    Tu te connectes 2 fosi sur le même port ? Si j'ai bein comprsi alors c'est normal. Un port c'est comme un téléphone, il ne peut être utilisé que par une personne (socket) à la fois.
    Dans ton cas, la deuxième connexion ferme la première, puis se connecte.
    merci de ne pas polluer le forum avec des assertions complètement erronés


    malheureusement je ne comprend pas grand chose au pascal, mais rien n'as l'air choquant à première vue
    par contre le client, ce bout de code ne montre strictement rien
    comment te rend-tu compte de la deconnexion?

    une bonne pratique en dev réseau c'est de coder un bout, de le valider avec un outil comme netcat, voir scapy (un peu comme des tests unitaires, mais pour le réseau), de coder l'autre bout, de le revalider avec ces memes utilitaires
    puis de valider les deux ensemble

    sinon ça deviens vite compliqué et on joue au ping pong entre le client et le serveur pour savoir d'ou viens le problème

  5. #5
    Membre confirmé
    Avatar de Mindiell
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 735
    Points : 546
    Points
    546
    Par défaut
    Citation Envoyé par Dark_Ebola Voir le message
    merci de ne pas polluer le forum avec des assertions complètement erronés
    Peux-tu m'expliquer où je me trompe s'il te plait ? Que j'évite de refaire la même bétise

Discussions similaires

  1. [Socket] Problème de lecture flux danss communication
    Par tooney dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 06/06/2005, 12h08
  2. [Socket] Détection de déconnexion
    Par Wookai dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 14/04/2005, 22h58
  3. [Thread][socket]Problème de fermeture d'un thread
    Par meda dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 04/11/2004, 02h03
  4. [Débutant] Problème de déconnexion d'une page JSP
    Par amal9 dans le forum Servlets/JSP
    Réponses: 12
    Dernier message: 22/01/2004, 14h40
  5. socket : problème avec GetHostByName
    Par SteelBox dans le forum Réseau
    Réponses: 25
    Dernier message: 19/08/2003, 14h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo