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 :

Client serveur : quel algorithme choisir


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 Client serveur : quel algorithme choisir
    salut.
    je voudrai faire un programme Client serveur. L'etablissement de la connection se passe sans problème, mais je n'ai pas su dire au programme comment recevoir l'invite de commande, demander la commande à l'utilisateur, faire la comparaison pour savoir si elle existe, executer les commandes correspondantes, puis retourner un tesultat.
    Ces opérations eux mêmes, ne sont pas difficiles à ecrire, mais il parais que je devrai les faire en boucle, pour que le programme marche bien... justement je n'ai pas su le faire

    voici un essai :
    Le 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
    #include<stdlib.h>
    #include<stdio.h>
    #include<string.h>
    #include<winsock2.h>
     
    /*********************************/
    int erreur=0;
    WSAData initialisation;
    SOCKET ma_socket;
    SOCKET acceptation;
    int temp;
    SOCKADDR_IN info_client;
    char buffer[65000];
    int reception;
    /********************************/
     
    int main()
    {
    /*initialisation de winsock*/
    erreur = WSAStartup(MAKEWORD(2,0), &initialisation);
    if(erreur!=0)
        {printf("Erreur lors de l'initialisation de WSAStartup. %d\n", WSAGetLastError());}
    else
        {printf("WSAStartup : OK\n");}
    /*ouverture de la socket*/
    ma_socket = socket(AF_INET, SOCK_STREAM, 0);
    if(ma_socket!=INVALID_SOCKET)
        {printf("Opening socket : OK\n");}
    else
        {printf("Erreur lors de l'ouverture de la socket. %d\n", WSAGetLastError());}
    /*sockoption*/
    temp=1;
    erreur = setsockopt(ma_socket, IPPROTO_TCP, TCP_NODELAY, (char*)&temp, sizeof(temp));
    if(erreur!=0)
        {printf("Erreur lors de la definition de l'algorithme de Nagle. %d\n", WSAGetLastError());}
    else
        {printf("Algorithme de Nagle : OK\n");}
     
    /*ecoute sur une ip et un port*/
    info_client.sin_family=AF_INET;
    info_client.sin_addr.s_addr=INADDR_ANY; // ecoute sur les IPs locales.
    info_client.sin_port=htons(7777);
    erreur=bind(ma_socket, (struct sockaddr*)&info_client, sizeof(info_client));
    if(erreur!=0)
        {printf("Erreur lors de la lise en ecoutes sur l'ip et/ou le port. %d\n", WSAGetLastError());}
    else
        {printf("IP et port : OK\n");}
     
    /*attente de la connection du client*/
    erreur=99;
    while(erreur!=0)
        {erreur=listen(ma_socket, 1);
        printf("Attente de la connection du client.\n");}
     
    /*acceptaion de la demande de connection*/
    temp=sizeof(info_client);
    acceptation=accept(ma_socket, (struct sockaddr*)&info_client, &temp);
    if(acceptation!=INVALID_SOCKET)
        {printf("connection du client : OK\n");
     
     
        /***************************************************************/
        memset(buffer, 0, sizeof(buffer));
        strcpy(buffer, "\nRFT >"); // l'invite de commande
        send(ma_socket, buffer, strlen(buffer), 0);
     
        recv(acceptation, buffer, 1515, 0); // reception de la commande
        if(strcpm(buffer, "com1")==0); //comparaison de la commande
            {memset(buffer,0,sizeof(buffer));
            strcpy(buffer, "\nCommande Correcte.");
            send(ma_socket, buffer, sizeof(buffer));}
        /***********************************************************/}
    else
        {printf("Connection invalide. %d\n", WSAGetLastError());}
     
        /*reception des données*/
    reception=recv(acceptation, buffer, 1515, 0);
    if(reception==SOCKET_ERROR)
        {printf("Aucune donnes recue. %d\n", WSAGetLastError());}
    else
        {buffer[reception]=0;
        printf("Le Client dit :\n\t%s", buffer);}
     
    /*Fermeture de la cession TCP*/
    erreur=shutdown(acceptation, 2);
    if(erreur!=0)
        {printf("Erreur lors de la fermeture de la session TCP. %d\n", WSAGetLastError());}
    else
        {printf("Fermeture de la session TCP  : OK\n");}
     
    /*fermeture des 2 sockets*/
    erreur=closesocket(acceptation);
    if(erreur!=0)
        {printf("Erreur lors de le fermeture de la socket 1. %d\n", WSAGetLastError());}
    else
        {printf("Fermeture de la socket : OK\n");}
     
    erreur=closesocket(ma_socket);
    if(erreur!=0)
        {printf("Erreur lors de le fermeture de la socket 2. %d\n", WSAGetLastError());}
    else
        {printf("Fermeture de la socket : OK\n");}
     
    /*Fermeture de winsock*/
    erreur=WSACleanup();
    if(erreur!=0)
        {printf("Ereur lors de la fermeture de WinSock. %d\n", WSAGetLastError());}
    else
        {printf("Fermeture de winsock : OK\n");}
     
    system("PAUSE");
     
    }
    Le client
    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
    #include<winsock2.h>
    #include<stdlib.h>
    #include<stdio.h>
    #include<string.h>
    /*Le client*/
     
    int erreur=0;
    WSAData initialisation;
    SOCKET ma_socket;
    int temp;
    SOCKADDR_IN info_serveur;
    char buffer[65000];
    int envoi;
     
    int main()
    {
        /*initialisation de winsock*/
    erreur = WSAStartup(MAKEWORD(2,0), &initialisation);
    if(erreur!=0)
    {printf("Erreur lors de l'initialisation de WSAStartup. %d\n", WSAGetLastError());}
    else
    {printf("WSAStartup : OK\n");}
        /*ouverture de la socket*/
    ma_socket = socket(AF_INET, SOCK_STREAM, 0);
    if(ma_socket!=INVALID_SOCKET)
    {printf("Opening socket : OK\n");}
    else
    {printf("Erreur lors de l'ouverture de la socket. %d\n", WSAGetLastError());}
        /*sockoption*/
    temp=1;
    erreur = setsockopt(ma_socket, IPPROTO_TCP, TCP_NODELAY, (char*)&temp, sizeof(temp));
    if(erreur!=0)
    {printf("Erreur lors de la definition de l'algorithme de Nagle. %d\n", WSAGetLastError());}
    else
    {printf("Algorithme de Nagle : OK\n");}
     
    /*Ouverture de la session TCP*/
    info_serveur.sin_family=AF_INET;
    info_serveur.sin_addr.s_addr=inet_addr("127.0.0.1");
    info_serveur.sin_port=htons(7777);
     
    erreur=connect(ma_socket, (struct sockaddr*)&info_serveur, sizeof(info_serveur));
    if(erreur!=0)
    {printf("Erreur lors de l'ouverture de la session TCP. %d\n", WSAGetLastError());}
    else
    {printf("Remote Victim Fucked ...\n");
     
     
     
    /***********reception de l'invite*************************/
    acceptation=accept(ma_socket, (struct sockaddr*)&info_serveur, sizeof(info_client));
    recv(acceptation, buffer, 1515, 0);
    /********************/
    printf("\n%s ", buffer);
    memset(buffer, 0, sizeof(buffer));
    char commande[50]
    scanf("%s", &commande);
    /********************evois de la commande*********/
    strcpy(buffer, commande);
    envoi=send(ma_socket, buffer, strlen(buffer), 0);
    memset(buffer, 0, sizeof(buffer));
    /**********************************************************/
    }
     
     
     
     
        /*fermeture de la cession TCP*/
    erreur=shutdown(ma_socket, 2);
    if(erreur!=0)
    {printf("Erreur lors de la fermeture de la session TCP. %d\n", WSAGetLastError());}
    else
    {printf("Fermeture de la session TCP  : OK\n");}
     
        /*Fermeture de la socket*/
    erreur=closesocket(ma_socket);
    if(erreur!=0)
    {printf("Erreur lors de le fermeture de la socket. %d\n", WSAGetLastError());}
    else
    {printf("Fermeture de la socket : OK\n");}
     
        /*Fermeture de winsock*/
    erreur=WSACleanup();
    if(erreur!=0)
    {printf("Ereur lors de la fermeture de WinSock. %d\n", WSAGetLastError());}
    else
    {printf("Fermeture de winsock : OK\n");}
     
    system("PAUSE");
     
    }
    Merci de votre aide

  2. #2
    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
    salut.
    je voudrai faire un programme Client serveur. L'etablissement de la connection se passe sans problème, mais je n'ai pas su dire au programme comment recevoir l'invite de commande, demander la commande à l'utilisateur, faire la comparaison pour savoir si elle existe, executer les commandes correspondantes, puis retourner un tesultat.
    Ces opérations eux mêmes, ne sont pas difficiles à ecrire, mais il parais que je devrai les faire en boucle, pour que le programme marche bien... justement je n'ai pas su le faire
    Je n'ai pas regardé le détail mais une application client serveur typique du type Telnet (conversationnel) fonctionne comme ceci (pseudo-C):

    Client :

    Thread emission :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while (!fin)
    {
       fgets(commande)
       send(commande)
    }
    Thread reception
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while (!fin)
    {
       recv(reponse)
       printf(reponse)
    }
    Serveur :
    Thread client
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    while (!fin)
    {
       recv(commande)
       select(commande)
       {
       case a
          send(reponse a)
       case b
          send(reponse b)
       case c
          send(reponse c)
       }
    }
    Il n'y a aucune difficulté majeure.
    Pas de Wi-Fi à la maison : CPL

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

Discussions similaires

  1. Client FTP, quel langage choisir?
    Par Orlyn dans le forum Langages de programmation
    Réponses: 8
    Dernier message: 21/04/2010, 09h18
  2. [c++] Développement Client/Serveur: Quel est le principe?
    Par _pouet dans le forum Développement
    Réponses: 12
    Dernier message: 22/09/2009, 22h22
  3. Application Client/Serveur (Quel solution?)
    Par elraton dans le forum C++
    Réponses: 5
    Dernier message: 16/07/2009, 18h35
  4. client serveur quel choix
    Par LeXo dans le forum C++
    Réponses: 9
    Dernier message: 08/02/2008, 15h32
  5. [client/serveur] Quel est format de requêtes Client/BDD ?
    Par sotuxan dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 05/03/2006, 12h52

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