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

Réseau C Discussion :

Communication TCPIP multi-clients


Sujet :

Réseau C

  1. #1
    Membre averti
    Homme Profil pro
    Stagiaire
    Inscrit en
    Mai 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Stagiaire

    Informations forums :
    Inscription : Mai 2009
    Messages : 22
    Par défaut Communication TCPIP multi-clients
    Bonjour,
    Cela fait un mois que je suis dessus et je pense avoir pas mal avancer mais la il y a certain petit problème que je n'arrive pas à régler.
    Je fais une communication TCPIP multi-clients avec un pic18F97J60 sur une carte PICDEM.net2 que je programme à l'aide d'un ICD2 sous MPLAB (v8.30 et stack v4.55).
    J'aimerai pouvoir:

    - Changer ma MAC address que j'arrive à afficher sur mon LCD (en déimal malheureusement). Je la change avec TCPConfigWizard mais elle est toujours identique lorsque je vais voir avec Ethernet Discover

    - Je fais des actions (basiques pour l'instant afficher des trucs su le LCD allumer les leds etc...) mais j'aimerai pouvoir passer à l'octet suivant sans refaire un switch (qui serrai simple mais super mega sale)...donc j'ai fait une fonction qui ressemble çà ROTL en assembleur mais je me fais jeter...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	char Verlan(char var[50],unsigned int lg)
    	{
    		char new_var[50];
    		BYTE i;
     
    		memset(new_var,' ',32);
    		for(i=0;i<lg;i++)
    		{
    			new_var[lg-i]=var[i];
    			new_var[i]=var[i++];		 
    		}
    		return new_var;
    	}
    Je bugg totalement à ce point la...

    Merci de votre aide.
    Brieuc

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    La fonction Verlan retourne un type char, or, on lui demande de retourner un tableau de char...

    Solution : Passer la chaine à inverser en paramètre :

    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
    void Verlan(const char s_in[50], char s_out[50],unsigned int lg)
    {
        BYTE i;
        /* vérification du paramètre lg pour éviter les débordements */
        if(lg > 49) {
            lg = 49;
        }
        /* on remplit la destination avec des 0*/
        memset(s_out, '\0', lg+1);
        /* calcul du mot inversé */
        for(i=0;i<lg;i++)
        {
            s_out[lg-i-1]=s_in[i];
        }
    }

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    et en plus de ce qu'a dit mabu,

    Citation Envoyé par BriocheNC Voir le message
    donc j'ai fait une fonction qui ressemble çà ROTL en assembleur mais je me fais jeter...
    parfaitement normal que ça crash (même si le compilo te jette à cause de ce qu'a dit mabu) :

    tu retournes un tableu lol (new_var) qui n'a plus d'existence à l'extérieur....

  4. #4
    Membre averti
    Homme Profil pro
    Stagiaire
    Inscrit en
    Mai 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Stagiaire

    Informations forums :
    Inscription : Mai 2009
    Messages : 22
    Par défaut
    le CONST!!c'est le const que je trouvais plus...
    Merci bien
    Par contre l'appel je le fais normal du style :
    Verlan(chaine,eniahc,7);
    ou y a un truc avec le const...c'est le genre de truc a la con que j'oublie a chaque fois...
    Merci encore
    C'est bon j'ai réussi, je m'étais gourré si je mets un lg supérieur à chaine ça me renvoi un truc vierge...
    Merci encore bcp...
    bon weekend.

  5. #5
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par BriocheNC Voir le message
    Par contre l'appel je le fais normal du style :
    Verlan(chaine,eniahc,7);
    ou y a un truc avec le const...c'est le genre de truc a la con que j'oublie a chaque fois...
    Le code donné attend queque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char entree[] = "mon message";
    char sortie[50];
    /* strlen(entree) est 11 ici. */
    Verlan(entree, sortie, strlen(entree));

  6. #6
    Membre averti
    Homme Profil pro
    Stagiaire
    Inscrit en
    Mai 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Stagiaire

    Informations forums :
    Inscription : Mai 2009
    Messages : 22
    Par défaut
    Salut,

    Après avoir passé un bon moment à essayer de faire exactement ce que je voulais càd choisir le nombre de rotation que je souhaite je finis avec un code qui ressemble à ceci:
    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
     
    	//fonction Verlan
    	// mot: char à rotationner
    	// tom: char rotationné 
    	// lg : nombre de rotation
    	void Verlan(const char mot[50], char tom[50],unsigned int lg)
    	{
    	    BYTE i,j;
    		char interm[50];
    	    // vérification du paramètre lg pour éviter les débordements 
    	    if(lg > strlen(mot)) 
    	    {
    	        lg = strlen(mot);
    	    }
    	    // on remplit la variable intermédiare et la destination avec des 0
    	 	memset(interm, '\0', sizeof(interm));
    		memset(tom, '\0', sizeof(tom));
    	    // calcul du mot inversé
    		strcpy((char*)tom,(char*)mot);
    		do
    		{ 
    			for(i=0;i<(strlen(mot)-1);i++)
    		    {
    				interm[strlen(mot)-1]=tom[0];
    		        interm[i]=tom[i+1];
    		    }
    			strcpy((char*)tom,(char*)interm);
    			lg--;
    		}while(lg > 0);
     
    	}
    J'ai perdu du temps parce que je ne voulais pas utiliser de variable intermédiaire au début puis avec ça marche donc bon...
    Par contre pour moi il est optimiser à mort.
    Merci pour votre aide.

    Bonne continuation.
    Brieuc

  7. #7
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par BriocheNC Voir le message
    Par contre pour moi il est optimiser à mort.
    Hum :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	for(i=0;i<(strlen(mot)-1);i++)
    		    {
    				interm[strlen(mot)-1]=tom[0];
    		        interm[i]=tom[i+1];
    		    }
    A chaque itération de la boucle for, on appelle deux fois strlen, ce n'est pas vraiment optimisé.
    De plus à chaque itération, on affecte toujours la même case dans le tableau interm.
    Le code suivant fait la même chose que la boucle for que tu avais écrit, mais évite certaines redondances.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    size_t len = strlen(mot)-1;
    interm[len]=tom[0];
    for(i=0;i<len;i++)
    {
        interm[i]=tom[i+1];
    }
    PS : on pourrait même faire sortir le size_t len = strlen(mot)-1; de la boucle do while.

  8. #8
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    De plus, tu as une erreur de principe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	void Verlan(const char mot[50], char tom[50],unsigned int lg)
    	{
    ...
    		char interm[50];
    ...
    	    // on remplit la variable intermédiare et la destination avec des 0
    	 	memset(interm, '\0', sizeof(interm));
    		memset(tom, '\0', sizeof(tom));
    	    // calcul du mot inversé
    		strcpy((char*)tom,(char*)mot);
    ...
    Le second memset est faux : sizeof tom donne la taille d'un pointeur, pas celle du tableau passé en argument.

    Mais, tu as une double "chance" :

    1- Ton tableau fait (probablement) 50 bytes donc est plus grand que sizeof(char*) et tu ne plantes pas sur ce memset

    2- le strcpy se moque de l'initialisation ou non du tableau de destination.

  9. #9
    Membre averti
    Homme Profil pro
    Stagiaire
    Inscrit en
    Mai 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Stagiaire

    Informations forums :
    Inscription : Mai 2009
    Messages : 22
    Par défaut
    Vous avez raison.

    A chaque itération de la boucle for, on appelle deux fois strlen, ce n'est pas vraiment optimisé.
    Je n'avais pas vu pour le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    interm[strlen(mot)-1]=tom[0];
    Donc je l'ai sorti de la boucle for et j'ai mis strlen(mot)-1 dans une variable.
    Merci beaucoup Mabu.

    tu as une erreur de principe
    On est jamais trop prudent mais tu as raison.
    Merci diogene.

    Maintenant je suis coincé sur un truc (con je pense).
    En fait mon but est de crypter ma communication TCPIP.
    Donc au début j'essaie juste de faire une comparaison avec mon buffer.

    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
     
     
    case '7' :  
    		memset(LCDText, ' ', 32);
    		memset(mess, ' ', sizeof(mess));
    		Verlan(bfr,bfr,1);
    		bfr[strlen(bfr)-1]=' ';
     
    		//test pour voir qu'est ce qu il y a dans le buffer
    		strcpypgm2ram((char*)LCDText,"buffer");
    		LCDUpdate();
    		DelayMs(1000);
    		strcpy((char*)LCDText,(char*)bfr);
    		LCDUpdate();
    		DelayMs(1000);
     
    		//test pour voir qu'est ce que me renvoie strcmp
    		strcpypgm2ram((char*)LCDText,"strcmp");
    		LCDUpdate();
    		DelayMs(1000);
    		strcpy((char*)mess,(char*)inter);
    		strcmp(bfr,"admin");
    		strcpy((char*)mess,(char*)inter);
    		strcpy((char*)LCDText,(char*)mess);
    		LCDUpdate();
    		DelayMs(1000);
     
    		if (strcmp(bfr,"admin")==0)
    		{
    			memset(LCDText, ' ', 32);
    			strcpypgm2ram((char*)mess,"bonjour chef");
    			strcpy((char*)LCDText,(char*)mess);		
    			LCDUpdate();
    			send(ClientSock[i], mess, sizeof(mess),0);
    		}
    		else
    		{	
    			memset(LCDText, ' ', 32);
    			//test pour voir si strcmp est toujours identique
    			strcpypgm2ram((char*)LCDText,"strcmp");
    			LCDUpdate();
    			DelayMs(1000);
    			strcpy((char*)LCDText,strcmp(bfr,"admin"));		
    			LCDUpdate();
    			DelayMs(1000);
    			//test pour voir le buffer
    			strcpypgm2ram((char*)LCDText,"buffer");
    			LCDUpdate();
    			DelayMs(1000);
    	        strcpy((char*)LCDText,(char*)bfr);
    			LCDUpdate();
    			send(ClientSock[i], bfr, sizeof(bfr),0);
    		}
    	break;
    Le problème c'est que strcmp me renvoie jamais 0 que je mette ' ' ou '\0' à la place de '7'...

    Merci encore pour votre aide.

  10. #10
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    que viennent faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    		bfr[strlen(bfr)-1]=' '; 
    
    		//test pour voir qu'est ce qu il y a dans le buffer
    		strcpypgm2ram((char*)LCDText,"buffer");
    		LCDUpdate();
    		DelayMs(1000);
    		strcpy((char*)LCDText,(char*)bfr);
    		LCDUpdate();
    		DelayMs(1000);
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    		//test pour voir qu'est ce que me renvoie strcmp
    		strcpypgm2ram((char*)LCDText,"strcmp");
    		LCDUpdate();
    		DelayMs(1000);
    		strcpy((char*)mess,(char*)inter);
    		strcmp(bfr,"admin");
    ???


    • strcmp ici n'est pas stocké, ni utilisé dans un test =>
    • pourquoi mettre un blanc à la fin de bufr et non pas un '\0' ?

  11. #11
    Membre averti
    Homme Profil pro
    Stagiaire
    Inscrit en
    Mai 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Stagiaire

    Informations forums :
    Inscription : Mai 2009
    Messages : 22
    Par défaut
    En fait, je fais un switch pour gérer mes actions.
    Et il faut faire '7' pour rentrer dans ce case c'est pourquoi j'utilise le Verlan pour mettre le '7' à la fin et mettre un ' ' ou '\0' ne change rien ça bugg quand même.
    Après c'est vrai que je ne stock pas le strcmp (j'ai corrigé juste après l'avoir posté).

    Merci

    Update:
    Je viens de corriger: j'ai tout simplement mis dans une variable lors du test parce que je m'obstinais à vouloir faire le test directement sur le strcmp...
    comment perdre une journée...
    Merci

  12. #12
    Membre averti
    Homme Profil pro
    Stagiaire
    Inscrit en
    Mai 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Stagiaire

    Informations forums :
    Inscription : Mai 2009
    Messages : 22
    Par défaut
    Re-bonjour,

    je mets une nouvelle réponse car j'ai un autre problème (que j'ai depuis le début mais la ça commence à m'énervé).
    Je rappelle que je communique avec un pic18f97j60 (serveur) et mon ordi en tcpip.
    J'ai fait un programme client sous Visual Studio 2008 et lorsque je me déconnecte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (recep_continue != null) recep_continue.Abort();//obligatoire, le Application.exit()
                // ne suffit pas,le faire à cet endroit, pas après les close, sinon
                //le thread peut essayer de lire après les fermetures!
                if (flux != null) flux.Close(); //fermeture du flux
                if (clienttcp != null) clienttcp.Close(); //fermeture de la connexin client         
                //MessageBox.Show("Déconnexion");
                //Application.Exit(); fermeture de l'application
    j'attéri toujours dans des exceptions du thread (recept_continue) puis du flux (networkstream) puis du clienttcp (TCPClient).

    Je suis novice sur VS donc je sais pas trop...
    Merci pour votre aide

Discussions similaires

  1. Communication Serveur- Multi Client via socket
    Par jesuisperdu dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 14/03/2011, 09h37
  2. [TCPServer/Client] Communication TCP multi-clients
    Par prgasp77 dans le forum Web & réseau
    Réponses: 1
    Dernier message: 14/12/2008, 16h04
  3. communication entre poste client windows et db mysql distant
    Par gabole dans le forum Bases de données
    Réponses: 3
    Dernier message: 24/08/2004, 16h59
  4. Serveur Multi-clients
    Par darsky dans le forum C++Builder
    Réponses: 5
    Dernier message: 16/04/2004, 09h53
  5. Création d'un Serveur Multi Client
    Par N*E*R*D dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 16/03/2004, 17h13

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