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 :

Aide pour serveur/client en C


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 15
    Points : 5
    Points
    5
    Par défaut Aide pour serveur/client en C
    Bonjour à tous
    Je dois développer un programme permettant la création d'un serveur et d'un client depuisla connxeion entre les deux et établir une discussion. J'ai déja le serveur et le client qui tourne bien mais jene sais pas comment faire la discusion entre. Voici mon serveur et mon client

    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
    #include <stdio.h>
    #include <errno.h>
    #include <signal.h>
     
    #include <netdb.h>
    #include <netinet/in.h>
    #include <sys/socket.h>
     
    #define SERVEURNAME "127.0.0.1"
     
    int to_server_socket = -1;
     
    void main ( void )
    {
     
    char *server_name = SERVEURNAME;
    struct sockaddr_in serverSockAddr;
    struct hostent *serverHostEnt;
    long hostAddr;
    long status;
    char buffer[512];
     
    bzero(&serverSockAddr,sizeof(serverSockAddr));
    hostAddr = inet_addr(SERVEURNAME);
    if ( (long)hostAddr != (long)-1)
      bcopy(&hostAddr,&serverSockAddr.sin_addr,sizeof(hostAddr));
    else
    {
      serverHostEnt = gethostbyname(SERVEURNAME);
      if (serverHostEnt == NULL)
      {
        printf("ca chie gethost\n");
        exit(0);
      }
      bcopy(serverHostEnt->h_addr,&serverSockAddr.sin_addr,serverHostEnt->h_length);
    }
    serverSockAddr.sin_port = htons(30000);
    serverSockAddr.sin_family = AF_INET;
     
    /* creation de la socket */
    if ( (to_server_socket = socket(AF_INET,SOCK_STREAM,0)) < 0)
    {
      printf("ca chie creation socket client\n");
      exit(0);
    }
    /* requete de connexion */
    if(connect( to_server_socket,
                (struct sockaddr *)&serverSockAddr,
                sizeof(serverSockAddr)) < 0 )
    {
      printf("ca chie demande de connection\n");
      exit(0);
    }
    /* envoie de donne et reception */
    write(to_server_socket,"Toto",4);
    read(to_server_socket,buffer,512);
    printf(buffer);
    /* fermeture de la connection */
    shutdown(to_server_socket,2);
    close(to_server_socket);
    }

    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
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <signal.h>
     
    void fin (int i);
    void appli(int no_client_socket);
    char buffer[512];
    int ma_socket;
     
    void main ( void )
    {
    int client_socket;
    struct sockaddr_in mon_address, client_address;
    int mon_address_longueur, lg;
     
    bzero(&mon_address,sizeof(mon_address));
    mon_address.sin_port = htons(30000);
    mon_address.sin_family = AF_INET;
    mon_address.sin_addr.s_addr = htonl(INADDR_ANY);
     
    /* creation de socket */
    if ((ma_socket = socket(AF_INET,SOCK_STREAM,0))== -1)
    {
      printf("ca chie avec la creation\n");
      exit(0);
    }
    signal(SIGINT,fin);
    /* bind serveur - socket */
    bind(ma_socket,(struct sockaddr *)&mon_address,sizeof(mon_address));
     
    /* ecoute sur la socket */
    listen(ma_socket,5);
     
    /* accept la connexion */
    mon_address_longueur = sizeof(client_address);
    while(1)
    {
      client_socket = accept(ma_socket,
                             (struct sockaddr *)&client_address,
                             &mon_address_longueur);
     
      if (fork() == 0)
      {
        close(ma_socket);
     
        lg = read(client_socket,buffer, 512);
        printf("le serveur a recu: %s\n",buffer);
        sprintf(buffer,"%s du serveur",buffer);
        write(client_socket,buffer, 512);
        shutdown(client_socket,2);
        close(client_socket);
        exit(0);
      }
    }
    shutdown(ma_socket,2);
    close(ma_socket);
    }
     
     
    void appli(int no_client_socket)
    {
      printf("ici le serveur\n");
    }
     
    void fin(int i)
    {
    shutdown(ma_socket,2);
    close(ma_socket);
    }
    quelques lignes ajouté aux deux programmes pour permettre une discussion entre le client et le serveur
    mici

  2. #2
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut
    A première vue ce code fait déjà discuter ton serveur et ton client.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Oui mais je souhaterais lemodifier pour pouvoir envoyer plusieurs messages entre le serveur et le client, parce que dans le cas présent il envoi juste un message puis il se déconnecter.

  4. #4
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    Citation Envoyé par margou Voir le message
    Oui mais je souhaterais lemodifier pour pouvoir envoyer plusieurs messages entre le serveur et le client, parce que dans le cas présent il envoi juste un message puis il se déconnecter.
    Pour envoyer plusieurs messages, il te suffit de faire une boucle (while par exemple).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    tant que (client_connecter ET client_ne _veut_pas_se_deconnecter) faire
     lire(message)
     envoyer(message)
     demande_si_On_doit_Arreter()
    finfaire

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    merci beaucoup pour ton aide mais ça donnerais quoi en C ?

  6. #6
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    C' est que j' utilise winsock2. Je ne connais les fonctions que tu utilise pour les sockets.
    Mais je vais essayer avec tes fonctions :
    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
     
    #include <stdio.h>
    #include <string.h>
    #include <errno.h>
    #include <signal.h>
     
    #include <netdb.h>
    #include <netinet/in.h>
    #include <sys/socket.h>
     
    #define SERVEURNAME "127.0.0.1"
     
    int to_server_socket = -1;
     
    void main ( void )
    {
     
    char *server_name = SERVEURNAME;
    struct sockaddr_in serverSockAddr;
    struct hostent *serverHostEnt;
    long hostAddr;
    long status;
    char buffer[512];
    char message[50];
     
    bzero(&serverSockAddr,sizeof(serverSockAddr));
    hostAddr = inet_addr(SERVEURNAME);
    if ( (long)hostAddr != (long)-1)
      bcopy(&hostAddr,&serverSockAddr.sin_addr,sizeof(hostAddr));
    else
    {
      serverHostEnt = gethostbyname(SERVEURNAME);
      if (serverHostEnt == NULL)
      {
        printf("ca chie gethost\n");
        exit(0);
      }
      bcopy(serverHostEnt->h_addr,&serverSockAddr.sin_addr,serverHostEnt->h_length);
    }
    serverSockAddr.sin_port = htons(30000);
    serverSockAddr.sin_family = AF_INET;
     
    /* creation de la socket */
    if ( (to_server_socket = socket(AF_INET,SOCK_STREAM,0)) < 0)
    {
      printf("ca chie creation socket client\n");
      exit(0);
    }
    /* requete de connexion */
    if(connect( to_server_socket,
                (struct sockaddr *)&serverSockAddr,
                sizeof(serverSockAddr)) < 0 )
    {
      printf("ca chie demande de connection\n");
      exit(0);
    }
    while (1) do
    {
    /* envoie de donne et reception */
    printf("Message  (tapez 0 pour finir) : ");
    scanf("%s",message);
    if (strcmp(message, "0")=0) break;
     
    write( to_server_socket, message, sizeof(message) );
    read(to_server_socket, buffer, sizeof(buffer) );
    printf("%s \n",buffer);
    }
     
    /* fermeture de la connection */
    shutdown(to_server_socket,2);
    close(to_server_socket);
    }
    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
     
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <signal.h>
     
    void fin (int i);
    void appli(int no_client_socket);
    char buffer[512];
    int ma_socket;
     
    void main ( void )
    {
    int client_socket;
    struct sockaddr_in mon_address, client_address;
    int mon_address_longueur, lg;
     
    bzero(&mon_address,sizeof(mon_address));
    mon_address.sin_port = htons(30000);
    mon_address.sin_family = AF_INET;
    mon_address.sin_addr.s_addr = htonl(INADDR_ANY);
     
    /* creation de socket */
    if ((ma_socket = socket(AF_INET,SOCK_STREAM,0))== -1)
    {
      printf("ca chie avec la creation\n");
      exit(0);
    }
    signal(SIGINT,fin);
    /* bind serveur - socket */
    bind(ma_socket,(struct sockaddr *)&mon_address,sizeof(mon_address));
     
    /* ecoute sur la socket */
    listen(ma_socket,5);
     
    /* accept la connexion */
    mon_address_longueur = sizeof(client_address);
    client_socket = accept(ma_socket,
                             (struct sockaddr *)&client_address,
                             &mon_address_longueur);
     
    while(1)
    {
     
      if (fork() == 0)
      {
        /* close(ma_socket); */
     
        lg = read(client_socket,buffer, 512);
        printf("le serveur a recu: %s\n",buffer);
     
        sprintf(buffer,"%s du serveur",buffer);
        write(client_socket,buffer, 512);
        /* shutdown(client_socket,2);
        close(client_socket);
         exit(0); 
       */
      }
    }
     
    shutdown(ma_socket,2);
    close(ma_socket);
    }
     
     
    void appli(int no_client_socket)
    {
      printf("ici le serveur\n");
    }
     
    void fin(int i)
    {
    shutdown(ma_socket,2);
    close(ma_socket);
    }

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    merci pour ton aide je vais voir tout ça

Discussions similaires

  1. choix et aide pour serveur sous linux suse
    Par asus02 dans le forum Matériel
    Réponses: 3
    Dernier message: 14/12/2007, 11h35
  2. Demande d'aide pour un client IRC
    Par yomane 51 dans le forum Débuter
    Réponses: 1
    Dernier message: 17/09/2007, 09h41
  3. Aide pour serveur dédié plesk et DNS
    Par gadget2 dans le forum Windows Serveur
    Réponses: 1
    Dernier message: 27/11/2006, 17h53
  4. Aide pour serveur TCP multithread
    Par kingkong dans le forum Réseau
    Réponses: 3
    Dernier message: 27/04/2006, 13h37
  5. Aide pour un client irc
    Par Coussati dans le forum Web & réseau
    Réponses: 1
    Dernier message: 01/11/2005, 03h35

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