begin process at 2012 05 29 22:10:42
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Linux

 > 

Réseau & Internet

 > 

Problème de socket non bloquante


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Problème de socket non bloquante

vendredi 17 novembre 2006 à 12:31:15 | Problème de socket non bloquante

Rankin

Bonjour !
Je travaille actuellement sur la réalisation d'un chat très sommaire en C. La solution que j'ai adoptée consiste, côté serveur, à avoir un tableau de clients connectés contenant leur nom et le numéro de descripteur de la socket créée pour la communication avec eux.
Je définis ces sockets comme non bloquantes et je boucle sur les descripteurs jusqu'à recevoir un message. Lorsque c'est le cas, je le renvoie à tous les clients connectés, sauf l'envoyeur.
Cependant ça ne se passe pas exactement comme prévu, quand un client envoie un message au serveur, tout se passe comme si il le recevait à chaque tour de boucle, et qu'il le renvoyait en boucle aux clients...
Je n'ai pas trouvé de solution à ce problème étant donné que cette solution bourine est très peu utilisée. J'envisage également de tester la fonction select() mais auparavant j'aimerais quand même que ma solution fonctionne...
Je joins à mon message le bloc qui pose problème, en espérant que vous pourrez m'aider sur le fonctionnement bizarre de ma fonction recv() !
Merci bien.

       /*tabDesc contient les descripteurs de socket
        *l'attribut descBrCv est égal à -1 si cette case est vide
        */
        if(tabDesc[indexDesc].descBrCv != -1) {
            char *msg = (char*)malloc(sizeof(char)*1000);
            //si on reçoit un message
            if(recv(tabDesc[indexDesc].descBrCv,msg,strlen(msg),0) != -1) {
                cout<<"message recu !"<<endl;
                //on l'envoie à  chaque client sauf celui qui a envoyé le message
                for (int i=0;i<NB_CLIENT;i++) {
                    if(tabDesc[i].descBrCv!=-1 && i != indexDesc) {
                        char* envoi = new char[strlen(msg)+strlen(tabDesc[i].nom)+4];
                        strcat(envoi,tabDesc[i].nom);
                        strcat(envoi," : ");
                        strcat(envoi,msg);
                        int retourSend =send(tabDesc[i].descBrCv,envoi,strlen(envoi),0);
                        if(retourSend==-1)
                            perror("Erreur envoi");
                    }                       
                }
            }
        }

D'autre part voici le code d'envoi de message d'un client, montrant que ce n'est pas le client qui envoie en boucle...

                char envoi[1000];
                while(cin>>envoi) {
                    int retourSend = send(descBrCli,envoi,sizeof(envoi),0);
                    if(retourSend == -1)
                        perror("Erreur émission");
                }




Cette discussion est classée dans : message, envoi, char, tabdesc, descbrcv


Répondre à ce message

Sujets en rapport avec ce message

PROBLEME NETSEND [ par zzzzzz ] En fait j'essaye d'envoyer un message par la fonction net send via internet a ordi qui posssede xp. Si je mjet mon ip ca marche et si je met l'ip de q envoi de message sur differentes interface [ par hobbes ] pouvez vous m indiquer comment je peux envoyer un message avec les interfaces suivantes :UDPTCPSERIECAN Fonction *char [ par moustachu ] Bonjour,Je suis en train de faire évoluer une appli qui a pas de paramétrage à sortir de l'appli. Tout est codé en dir et ça craint assez (ex : strcpy Thread et variable globale [ par valoue ] Bonjour,Je developpe une application en C++.La classe que je developpe comporte une méthode "recevoir (char *trame). Dans cette méthode, je fais appel Envoi d'un message à un otre Ordi (réseau) [ par cyberlewis ] Salut,Voilà, après avoir (presque) tout essayer avec les Sockets, je cherche de l'aide svp :Mon but est de faire deux logiciels identiques, un sur le Envoi de message UDP sans socket ???? [ par thealex321 ] Salut à tous!Bon, ma question est vraiment parce que je ne comprends pas comment on peut envoyé un message sans créer un socket pour l'envoyer.Pourquo Truc de fou : Pointeurs qui ne comprennent pas les cases vides [ par toddis ] Bonjour,Voilà je suis en train de faire un driver modbus et pour cela j'ai crée une fonction qui calcule le lrc ( controle de validité du message).Le [Débutant]Surcharge opérateur + [ par Geolem ] Bonjour tout le monde ! Je n'arrive pas à surcharger mon opérateur +... En faite, il faudrait que j'applique l'opérateur + à un objet de Message et à code de cryptage,débutant [ par RoseX ] voila j'ai un probleme, je créé un logiciel ayant pour but de crypter un message et de le décrypter a demande. je vais dabors vous exposer mon code en Linux Variable passé a un Thread [ par mikoo74 ] Bonjour.Voila je doit envoyé une chaine a un Thread.  je fait:********************************char * message;message = new char [1000];if (pthread_cre


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,811 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales