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++ Discussion :

besoin d'aide sur les sockets


Sujet :

C++

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 24
    Points : 9
    Points
    9
    Par défaut besoin d'aide sur les sockets
    bonjour !

    Je suis etudiant en informatique, et dans le cadre d'un projet, je dois réaliser une communication entre des wifibots. Pour ceci je passe par l'utilisation de socket en TCP. Je compile en borland C++ v5.02 et j'inclue la splendide librairie dos.h

    Or la fonction accept bloque le reste du programme j'ai l'impression, car rien ne se fait apres l'execution de cette fonction, et le terminal (telnet) me rend la main. Cependant, le programme continue de tourner en arriere plan vu qu'il est toujours dans la memoire et continue de bloquer le port ouvert.

    Le coté client est programmé en C++ avec la librairie QT (QTCPsocket, etc ...). Mon appli fonctionne correctement en ce qui concerne la connexion, puisqu'avec le programme fourni avec wifibot (dont je n'ai pas le code), j'arrive a me connecter. J'ai fait plusieures tentative dont une boucle infini autour du accept, un réarrangement de la fonction qui prenait un int *error au lieu de int *longueur, mais rien ne fonctionne. Une idée quelqu'un ?

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    struct sockaddr_in   addr;
       struct sockaddr_in   claddr;
     
       int sd,asd,established,i,retval,error,lg;
     
       retval = opensocket( SOCK_STREAM, &error );
     
       if(retval == API_ERROR)//API_ERROR = -1, voir TCPIPAPI.h
       {
    	    printf("\r\nSocket open failed: %d",error);
    	    goto TCP_SERVER_DONE;
       }
       else
       {
    	    sd = retval;
       }
     
       addr.sin_family =  PF_INET;
       //convert your sending port to correct byte order
    	retval = htons(TM_PORT_ECHO);
     
       addr.sin_port =  retval;
       addr.sin_addr.s_addr =  0L;
     
       retval = bind( sd, (struct sockaddr *) &addr, &error );
     
       if(retval == API_ERROR)
       {
    	    printf("\r\nTCPserver: Socket bind failed: %d",error);
    	    goto TCP_SERVER_DONE;
       }
     
       while(1)   //do forever
       {
     
         printf("\r\nTCPserver: Listening for connection on socket");
         retval = listen( sd, 1, &error );// 1 -> nb max de connections écoutées en meme temps
     
            if(retval == API_ERROR)// !=-1
            {
    	         printf("\r\nTCPserver: Socket listen failed: %d",error);
    	         goto TCP_SERVER_DONE;
            }
     
         claddr.sin_family      =  PF_INET;
         claddr.sin_port        =  0;
         claddr.sin_addr.s_addr =  0L;
         lg = sizeof(struct sockaddr);
         retval = accept( sd, (struct sockaddr *) &claddr, &lg );
    /*avant la fonction avait &error au lieu de &lg*/
         if(retval == API_ERROR)
         {
    	      printf("\r\nTCPserver: Socket accept failed: %d",error);
    	      goto TCP_SERVER_DONE;
         }

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    accept() est supposée bloquante jusqu'à ce qu'un client se connecte.

  3. #3
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 24
    Points : 9
    Points
    9
    Par défaut
    c'est ce que je supposais aussi d'apres mes cours, mais en ce cas, pourquoi le systeme me rend la main ??

    et si elle etait bloquante, je pourrais quand meme me connecter dessus, or ce n'est pas le cas ici ...

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Désolé, je ne connais pas ces fonctions DOS. Elles ne suivent pas les spécifications des sockets Berkeley (suivies par les systèmes unixoïdes et plus ou moins par Windows), donc tout peut arriver...

    Es-tu sûr que le client parvient bel et bien à se connecter ?

  5. #5
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 24
    Points : 9
    Points
    9
    Par défaut
    Oui, le client fonctionne, en fait, je l'ai testé avec le programme inclu dans le wifibot t dont je n'ai pas le code et il ne me renvoie pas la fenetre de warning habituelle "hote inconnu", donc la connexion se passe bien (le reste apres c'est un autre probleme ...)

    il s'agit bel et bien de fonction dos puisque dans le .h associé, j'ai trouvé des fonctions incluant des registre et des interruptions systeme "int86" ... du coup je ne peux pas voir comment elles fonctionne et aucune documentation n'est fournie la dessus !

  6. #6
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Ok... c'est bien... mais il fait quoi le programme apres le accept ?

    A part le "opensocket" que je connais pas (pourquoi pas faire un simple socket(AF_INET....) ?) le reste a l'air d'être purement Berkeley

    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
     
       // create listening socket...
       socket   listener = socket(AF_INET,SOCK_STREAM,PROTO_TCP);
       if (listener == INVALID_SOCKET) {
          // ERROR
       }
     
       // bind to server-address/port
       sockaddr_in  localhost; // <= initialize correctly !
       if (bind(listener,localhost) == SOCKET_ERROR) {
          // ERROR
       }
     
       // listen to incoming connections
       if (listen(listener,2) == SOCKET_ERROR) {
          // ERROR
       }
     
       // start accepting connections...
       while (not_ended) {
            sockaddr_in  incominghostAddress;
            int incomingAddrLen= sizeof(incominghostAddress);
            socket incoming = accept(listener,&incominghostAddress,&incomingAddrLen);
            if (incoming != INVALID_SOCKET) {
                // HANDLING OF INCOMING CONNECTION
                handleConnection(incoming);
            }
        }
     
        closesocket(listener);
    }

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Tu n'as pas vu que toutes les fonctions prennent un int * en paramètre supplémentaire pour retourner une valeur d'erreur.
    Par contre,
    1. Normalement on n'appelle listen() qu'une seule fois
    2. Il faudrait afficher un message (avec un retour à la ligne) immédiatement après le accept() pour s'assurer que le bloquage est bien là et non plus loin.

  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    listen n'a rien à faire dans la boucle

  9. #9
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 24
    Points : 9
    Points
    9
    Par défaut
    compris, j'essaye sans le "listen" dans la boucle.

    Pour le "accept", j'ai mis un printf juste apres et pas de message, donc ca s'arrete bien au accept.

    J'essaye tout ca des que j'arrive a rechercher ces ****** de batteries ... comme si il ne me manquait que ca.

    merci

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Il y a bien un retour à la ligne à la fin du printf() en question ?
    (pour des raisons de bufferisation)

  11. #11
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 24
    Points : 9
    Points
    9
    Par défaut
    Oups ... je crois avoir fait cette classique erreur d'oublier le \n à la fin du printf donc de laisser le buffer plein ...

    c'est pas la premiere fois que ca m'arrive ca ... je teste des que possible en remettant correctement !

    merci

  12. #12
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 24
    Points : 9
    Points
    9
    Par défaut
    Probleme resolu ..... une grave erreur sur les ports. Le programme dont le code source n'est pas fourni ecoute sur tout les ports alors que le mien n'ecoute que sur un port, d'ou une erreur ...

    désolé de vous avoir dérangé pour ca. merci de votre attention et de vos conseils !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Besoin d'aide sur les sockets
    Par cryptorchild dans le forum Programmation et administration système
    Réponses: 1
    Dernier message: 03/04/2006, 17h27
  2. Besoin d'aide sur les fonction d'interbase
    Par BOUBOU81 dans le forum InterBase
    Réponses: 2
    Dernier message: 05/11/2004, 10h00
  3. besoin d'aide sur les ORB
    Par floorfille dans le forum CORBA
    Réponses: 4
    Dernier message: 24/08/2004, 15h43
  4. Filemaker ... besoin d'aide sur les Plugin
    Par joange dans le forum Autres SGBD
    Réponses: 3
    Dernier message: 22/04/2004, 10h16
  5. [CR] besoin d'aide sur les formules
    Par GuillaumeDSA dans le forum Formules
    Réponses: 4
    Dernier message: 10/07/2003, 12h19

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