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

C++Builder Discussion :

Socket et deconnexion : Tcp


Sujet :

C++Builder

  1. #1
    Invit�
    Invit�(e)
    Par d�faut Socket et deconnexion : Tcp
    Bien le bonjour a tous ^^ - Je viens souvent sur le site pour apprendre les ficelles du m�tier comme on dis. Je trouve ce site vraiment g�nial et j'aimerai commencer a entrer dans la communaut� ^^
    Je me lance ! Alors, j'ai voulu coder un programme de client sous builder 6 qui se connecte a un serveur cod� en C. Le serveur doit recevoir en permanence des donn�es jusqu'� d�connexion du client. J'ai donc mit un " while(1)" pour boucler la r�ception. Le soucis, c'est que j'aimerai avoir une "d�connexion propre". Par exemple, mon client se d�connecte pour laisser la place a un autre et ainsi lib�rer le serveur. Or, si je fait...
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    TcpClient1->Disconnect();
    TcpClient1->Close();
    ... pour d�connecter mon client, le serveur reste inactif... et si je ferme mon programme, j'ai l'erreur 10053. Voici le code serveur.
    Code : 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
    35
    36
    37
    38
    39
    40
    41
     if(sock_err != -1) // ou SOCKET_ERROR
                            {
                                        //Demarrage de l'ecoute à partir du server
                                        sock_err = listen(sock, 5);
                                        printf("Ecoute du port %d...\n", PORT);
                                        /* Si la socket fonctionne */
                                    while(1)
                                    {
                                        if(sock_err != -1) // ou  SOCKET_ERROR
                                        {
                                                    /* Attente pendant laquelle le client se connecte */
                                                    printf("Patientez pendant que le client se connecte sur le port %d...\n", PORT);
                                                    sock = accept(sock, (SOCKADDR*)&sin, &recsize);
     
     
                                                    printf("Un client se connecte avec la socket %d de %s \n", sock, inet_ntoa(sin.sin_addr), htons(sin.sin_port));
                                                    sock_err = send(sock, buffer, 50, 0);
                                                    if(sock_err != -1)
                                                    {
                                                             if(recv(sock, buffer ,sizeof(buffer), 0) != SOCKET_ERROR)
                                                             strcpy(buffer1, buffer);
                                                             if(recv(sock, buffer ,sizeof(buffer), 0) != SOCKET_ERROR)
                                                             strcpy(buffer2, buffer);
                                                             if(recv(sock, buffer ,sizeof(buffer), 0) != SOCKET_ERROR)
                                                             strcpy(buffer3, buffer);
                                                    }
     
                                                    printf("1ére val : %s\n",buffer1);
                                                    printf("2nd val : %s\n",buffer2);
                                                    printf("3éme val : %s\n",buffer3);
                                        }
     
                                    }
                                                    //fermeture de la socket
                                                    printf("Fermeture de la socket...\n");
                                                    closesocket(sock);
                                                    printf("Fermee \n");
                                                    }
                              //libére les ressources allouées par la fonction WSAStartup()
                             WSACleanup();
                      }
    Donc mon soucis est de garder le serveur ouvert jusqu'� la d�connexion du client de borland. Je sais que l'erreur est le while(1) mais sans cela, le serveur re�ois une fois les donn�es et se ferme, ne permettant aucune connexion.... J'ai test� avec un serveur sous borland en indiquant avec un label l'�tat du serveur. Et je n'ai jamais vu "d�connexion" affich�. M�me avec les ->Disconnect() et ->Close() .
    J'esp�re avoir �t� clair. Si vous voulez des pr�cisions, h�sitez pas.
    Derni�re modification par Invit� ; 20/04/2010 � 21h51. Motif: Titre plus pr�cis

  2. #2
    Membre confirm�
    Inscrit en
    Avril 2010
    Messages
    105
    D�tails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 105
    Par d�faut
    en fait pour que tu sorte, tu peux soit faire un exit(0) ce qui terminera le programme salement.

    sinon, tu rajoute un simple bool�en et au lieu du while(1) tu fais while(tonbool�en) et quand le socket se ferme, tu n'as qu'a mettre ton bool�en � false.

  3. #3
    Invit�
    Invit�(e)
    Par d�faut
    J'ai tent� un truc du genre while(buffer!=101) en envoyant 101 depuis mon client mais rien n'y fait... Toujours pas de fermeture de la boucle de r�ception.
    Et je n'ai toujours pas trouv� comment faire pour d�connecter le client.... J'ai tout tent� :
    TcpClient1->Disconnect();
    TcpClient1->Close();
    TcpClient1->Active=false;
    Mais le serveur n'y vois rien. Et dans le label indiquant les �tats du client, je ne vois jamais le :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    void __fastcall TForm1::TcpClient1Disconnect(TObject *Sender)
    {
     Label17->Caption = "Disconnect";
    }
    Je comprends vraiment pas.... le TcpClient1->Disconnect(); semble aussi utile que .... rien. Fin �a stoppe bien l'envoi de donn�e mais c'est tout... comme pour les autres fonction close() et active=false....J'ai effectu� trois test de fermeture avec seulement l'une des trois et a chaque fois, m�me r�sultat.
    Derni�re modification par Invit� ; 20/04/2010 � 21h46.

  4. #4
    Membre confirm�
    Inscrit en
    Avril 2010
    Messages
    105
    D�tails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 105
    Par d�faut
    salut !

    d�sol� de ne r�pondre que maintenant, ca m'�tonnerai d'ailleurs que tu lise mais bon


    Concr�tement, il faut que tu dise au serveur que tu vas te d�co en lui envoyant (par exemple) une commande avec la trame.


    Exemple :

    le client envoi "/quit"
    le serveur r�cup�re "/quit", comprend que le client va partir
    le serveur envoi "/bye"
    le serveur ferme les connexions
    le client recoit "/bye"
    le client ferme les connexions


    bonne chance !
    naga

Discussions similaires

  1. server de sockets unix et tcp/ip en mm tps?
    Par iznogoud36 dans le forum Linux
    R�ponses: 7
    Dernier message: 02/01/2007, 08h58
  2. Socket : UDP ou TCP
    Par lafracas dans le forum D�veloppement
    R�ponses: 2
    Dernier message: 10/04/2006, 22h43
  3. code c pour sockets (udp vers tcp et inversement)
    Par HiT dans le forum D�veloppement
    R�ponses: 11
    Dernier message: 19/11/2005, 18h03
  4. raw socket et protocole TCP/IP
    Par robertmouac dans le forum D�veloppement
    R�ponses: 3
    Dernier message: 09/03/2005, 23h09
  5. [Socket] Buffer et TCP
    Par rgz dans le forum Web & r�seau
    R�ponses: 7
    Dernier message: 14/10/2003, 13h59

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