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 :

Problème de verification d'une string


Sujet :

Réseau C

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 21
    Points : 15
    Points
    15
    Par défaut Problème de verification d'une string
    salut.
    Je suis entrains de faire une petite application client serveur simple.
    voici l'algo
    Le client se connecte au serveur sur une ip et un port.
    puis il affiche une invite de commande. l'utilisateur entre une string et l'envois au serveur.
    Ce dernier la compare avec les commande qu'il a (strcmp) puis envois au client une confirmation de ce qui s'est passé
    le problème reside dans la comparaison.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(strcmp(bufferRecv,"damn")==0)
                                {   strcpy(bufferSend,"Command 1 executed successfully !\n");}
                                else if(strcmp(bufferRecv,"linux")==0)
                                {   strcpy(bufferSend,"Command 2 excuted successfully !\n");}
                                else
                                {   strcpy(bufferSend,"Command not found !\n");}
    Quand j'entre une commande, le serveur me repond toujour qu'elle n'existe pas.

    voici la source de l'application
    Clien:
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
     
    #include <winsock2.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <windows.h>
     
    #define IP "127.0.0.1"
    #define PORT 2000
     
    void color(int couleurDuTexte,int couleurDeFond)
    {
            HANDLE H=GetStdHandle(STD_OUTPUT_HANDLE);
            SetConsoleTextAttribute(H,couleurDeFond*16+couleurDuTexte);
    }
     
     
    int main(void)
    {
        int error;
     
        color(2,0);
        puts("Client side \n\n");
        WSADATA WSAData;
        WSAStartup(MAKEWORD(2,0), &WSAData);
     
        SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
        if( sock != INVALID_SOCKET )
        {
            color(2,0);
            printf("Socket %d is new opened in TCP/IP mode.\n",sock);
     
            SOCKADDR_IN sin;
            sin.sin_addr.s_addr    = inet_addr(IP);
            sin.sin_family    = AF_INET;
            sin.sin_port    = htons(PORT);
     
            error = connect(sock, (SOCKADDR *)&sin, sizeof sin);
            if( error != SOCKET_ERROR )
            {
                char bufferSend[50];
                char bufferRecv[50];
                int go = 1;
     
                color(2,0);
                printf("Connected to server...\n\n");
                do
                {
                    color(9,0);
                    printf(".-=[RFT]=-. >");
                    fgets(bufferSend, sizeof bufferSend, stdin);
                    error = send(sock, bufferSend, strlen(bufferSend), 0);
                    color(7,0);
                    printf("Wating for reply....\n\n");
                    if(error == SOCKET_ERROR)
                    {   printf("Could not send data. %d\n",WSAGetLastError());}
     
                    error = recv(sock, bufferRecv, sizeof(bufferRecv)-1, 0);
                    if(error == SOCKET_ERROR)
                    {   printf("Could not send data. %d\n",WSAGetLastError());}
                    else
                    {
                        bufferRecv[error] = '\0';
                        color(12,0);
                        printf("%s\n",bufferRecv);
                    }
                }
                while (go);
     
                color(1,0);
                printf("send imposible, closing socket... %d\n",WSAGetLastError());
                closesocket(sock);
                printf("Socket %d is new closed. %d\n",sock,WSAGetLastError());
            }
            else
            {
                color(4,0);
                printf("Not connected ! connection failure.\n", WSAGetLastError());
                return EXIT_FAILURE;
            }
        }
        else
        {
            printf("Invalid Socket. Socket is not opened.\n", WSAGetLastError());
            return EXIT_FAILURE;
        }
     
     
        WSACleanup();
        color(7,0);
        system("pause");
        return EXIT_SUCCESS;
    }
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
     
     
    #include <winsock2.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
     
    #define PORT 2000
     
    void color(int couleurDuTexte,int couleurDeFond)
    {
            HANDLE H=GetStdHandle(STD_OUTPUT_HANDLE);
            SetConsoleTextAttribute(H,couleurDeFond*16+couleurDuTexte);
    }
     
     
     
    int main(void)
    {
        char bufferRecv[500];
        char bufferSend[500];
        int error;
     
        color(2,0);
        printf("Serveur side\n\n");
     
        WSADATA WSAData;
        WSAStartup(MAKEWORD(2,0), &WSAData);
     
        SOCKADDR_IN sin = {0};
        SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
     
        if( sock != INVALID_SOCKET )
        {
            color(2,0);
            printf("Socket %d is now opened in TCP/IP mode.\n",sock);
     
            sin.sin_addr.s_addr    = htonl(INADDR_ANY);
            sin.sin_family    = AF_INET;
            sin.sin_port    = htons(PORT);
     
            error = bind(sock, (SOCKADDR *)&sin, sizeof(sin));
            if( error != SOCKET_ERROR )
            {
                error = listen(sock, 2);
                if( error != SOCKET_ERROR )
                {
                    color(2,0);
                    printf("listening on port %d\n"
                           "Waiting for a client connection on this port...\n",PORT);
     
                    SOCKADDR_IN csin = {0};
                    int sizeofcsin = sizeof(csin);
                    SOCKET csock = accept(sock, (SOCKADDR *)&csin, &sizeofcsin);
                    if( csock != INVALID_SOCKET )
                    {
                        printf("Client connected\n\n");
     
                        int go = 1;
                        while(go)
                        {
                            memset(bufferRecv,0,sizeof(bufferRecv));
                            memset(bufferSend,0,sizeof(bufferSend)); //initialising the tow char variables
                            error = recv(csock, bufferRecv, sizeof(bufferRecv)-1, 0);
                            if(error != SOCKET_ERROR)
                            {
                                bufferRecv[error] = '\0';
                                color(12,0);
                                printf("Command receaved.\n"); //tells that the command was receved
                                // command checking prrocess
                                if(strcmp(bufferRecv,"damn")==0)
                                {   strcpy(bufferSend,"Command 1 executed successfully !\n");}
                                else if(strcmp(bufferRecv,"linux")==0)
                                {   strcpy(bufferSend,"Command 2 excuted successfully !\n");}
                                else
                                {   strcpy(bufferSend,"Command not found !\n");}
                            }
                            else
                            {
                                printf("Socket error, recv ! %d\n",WSAGetLastError());
     
                            }
     
                            color(9,0);
                            printf("Sending reply ...\n ");
                            error = send(csock, bufferSend, strlen(bufferSend), 0);
                            color(7,0);
                            printf("Waiting for another command....\n\n");
                            if(error == SOCKET_ERROR)
                            {
                                color(4,0);
                                printf("Socket error, send ! %d\n", WSAGetLastError());
     
                            }
                        }
     
                        shutdown(csock, 2);
                        closesocket(csock);
                        color(1,0);
                        printf("Client socket %d is now closed.\n",csock);
                    }
                    else
                    {
                        color(4,0);
                        printf("Invalide Socket, error in opening Client socket %d\n", WSAGetLastError());
                        system("pause");
                        return EXIT_FAILURE;
                    }
                }
            }
            closesocket(sock);
            color(1,0);
            printf("Server socket %d is now closed.\n",sock);
        }
        else
        {
            color(4,0);
            printf("Invalide Socket, erreur in opening Server socket %d\n", WSAGetLastError());
            system("pause");
            return EXIT_FAILURE;
        }
     
     
        WSACleanup();
        color(7,0);
        system("pause");
        return EXIT_SUCCESS;
    }

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Salut !


    Ton problème doit surement venir à mon avis de la récupération de la saisie avec fgets:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fgets(bufferSend, sizeof bufferSend, stdin);
    Il faut savoir que fgets, si elle lit toute la saisie ajoute un \n à la fin de la chaîne. Il faut donc le changer en \0 ! strcmp tiens justement compte de ca, il lui faut le zéro de fin pour chaque chaînes !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    je ne sais comment te remercier.
    j'ai changé fgets par scanf et cela marche bien
    mais une autre questuion: si je veux garder fgets que doi-je faire ?
    Encore merci

  4. #4
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par Franck.H
    Il faut savoir que fgets, si elle lit toute la saisie ajoute un \n à la fin de la chaîne.
    Elle ne l'ajoute pas. Il est la (puisque l'utilisateur a tape entree pour valider sa saisie) donc elle le lit. Par contre, elle ajoute un '\0' apres afin de former une chaine de caractere valide.
    Il est correct qu'avant de faire une comparaison, il faut remplacer le '\n' par un '\0' (strchr) ou agir s'il est absent (saisie trop longue pour le buffer).

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par e-medi
    je ne sais comment te remercier.
    j'ai changé fgets par scanf et cela marche bien
    mais une autre questuion: si je veux garder fgets que doi-je faire ?
    Encore merci
    Bin déjà change ton scanf par un fgets comme avant... évite scanf, pas bien !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char * p = strchr (bufferSend, '\n');
     
    if (p != NULL)
    {
       *p = 0;
    }
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  6. #6
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    d'accord, je vai le faire tout de suite. donc je devais faire du rechercher remplacer avec strchr, j'avais oublié cette fonction
    Encore merc i

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par e-medi
    si je veux garder fgets que doi-je faire ?
    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers

    Mais en fait, je conseille de transmettre la commande avec le \n et de le tester (et le retirer) à la réception. C'est une façon commune de terminer une commande texte.

    Mieux encore :
    A l'émission
    1. Définir un protocole applicatif, par exemple une commande est terminée par CR
    2. Saisir la commande avec fgets(),
    3. Tester et retirer le \n
    4. Ajouter un CR (13)
    5. Transmettre le tout.
    A la réception :
    1. Assembler la commande (elle se termine par CR)
    2. Retirer le CR final
    3. Interpréter la commande (strcmp() etc.)
    Pas de Wi-Fi à la maison : CPL

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

Discussions similaires

  1. [JDBC] Forcer la taille d'une string
    Par julio123 dans le forum JDBC
    Réponses: 4
    Dernier message: 10/06/2004, 09h43
  2. [DOM] parser une String pour en faire un document XML
    Par Fladnag dans le forum Format d'échange (XML, JSON...)
    Réponses: 9
    Dernier message: 29/03/2004, 11h04
  3. [Débutant][JSP] Ajout des caractères à une String...
    Par Henkyl dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 04/03/2004, 16h30
  4. [Syntaxe] mettre des ' dans une string ?
    Par souch dans le forum Débuter
    Réponses: 4
    Dernier message: 14/08/2003, 16h26
  5. Réponses: 6
    Dernier message: 24/07/2003, 12h39

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