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 client serveur


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 195
    Par défaut Communication client serveur
    bonsoir a tous !
    je débute en programmation de socket et quand je dis je débute c'est une histoire de quelques heures
    j'ai suivie pendant ces heures de nombreux tuto et j'ai essayer de generé un code rassemblant tout ce que j'ai vu.
    mon code est simple je cherche juste a créer un serveur et un client.
    le serveur envoie un message au client et le client l'affiche.
    sauf que biensur il ne l'affiche pas. je suis sur que mon erreur doit etre facilement identifiable mais moi je ne l'a trouve pas

    merci pour vos reponses voici mon code :


    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
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h> 
     
    int main(int argc,char**argv){
     
    	int sock;											// le socket
    	struct sockaddr_in sin;								// la structure qui contient les informations technique du socket
    	char * ip_destination = "127.0.0.1";				// l'adresse de l'hote
    	char * buffer[256];									// buffer de stockage de l'information recue
    	int port = 23;									// le port que l'on veut observer
     
     
    	sock = socket(AF_INET, SOCK_STREAM, 0); 			// socket(famille du socket , type de socket , protocol) 
    	sin.sin_addr.s_addr	= inet_addr(ip_destination);	// definition de l'adresse du serveur
    	sin.sin_family		= AF_INET;						// la famille du socket
    	sin.sin_port		= htons(port);					// definition port que l'on veut observer
    	connect(sock, (struct sockaddr *)&sin, sizeof(sin));// connection du socket sur le port
    	recv(sock, buffer, sizeof(buffer), 0);				// reception d'une eventuelle information envoyée par le serveur
    	close(sock);										// fermeture de la socket
    	printf("Information recue : %s",buffer);
     
     
    	return 0;
     
     
     
    }
    et puis 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
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h> 
     
    int main(int argc,char**argv){
     
    	int sock;												// socket du serveur
    	int csock;												// socket du client
    	struct sockaddr_in sin;									// informations du socket serveur
    	struct sockaddr_in csin;								// informations du socket client
    	unsigned int sinsize = sizeof(csin);								// on stock la taille du socket client
     
    	sock = socket(AF_INET, SOCK_STREAM, 0);					// socket(famille du socket , type de socket , protocol) 
    	sin.sin_addr.s_addr			= INADDR_ANY;				// le socket ecoutera n'importe quelle connection
    	sin.sin_family				= AF_INET;					// la famille du socket
    	sin.sin_port				= htons(23);				// le port utilisé
    	bind(sock, (struct sockaddr *)&sin, sizeof(sin));		// connection du socket sur le port
    	listen(sock, 0);										// le socket ecoute maintenant les connections
     
    	while(1){
    		csock = accept(sock, (struct sockaddr*)&csin, &sinsize); 	// on accept une connection au serveur
    		send(csock, "Message envoyé !\r\n", 18, 0);					// on envoie un message au client
     
    	}
    	return 0;
    }
    je compile le tout je crée deux executables client.exe et serveur.exe je lance le serveur et ensuite le client mais rien ne s'affiche dans mon shell

    merci !

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par nightwar Voir le message
    voici mon code :
    Client

    Pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    /* buffer de stockage de l'information recue */
       char *buffer[256];
    ce qui provoque
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    main.c:47: warning: passing arg 2 of `recv' from incompatible pointer type
    et pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    /* buffer de stockage de l'information recue */
       char buffer[256];
    Ca parait plus logique, non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    /* reception d'une eventuelle information envoyée par le serveur */
       recv (sock, buffer, sizeof (buffer), 0);
    Ce n'est pas comme ça qu'on traite la reception d'une chaine de caractères, mais comme 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
     
    /* reception d'une eventuelle information envoyée par le serveur */
       int n = recv (sock, buffer, sizeof buffer - 1, 0);
       if (n > 0)
       {
          buffer[n] = 0;
          printf (recu = '%s'\n, buffer);
       }
       else if (n < 0)
       {
          printf("erreur locale\n");
       }
       else
       {
          printf("deconnexion distante\n");
       }
    D'une manière générale, comme tu ne traites aucun code retour, tu n'as aucune visibilité sur ce qui se passe dans ton code, ce qui est particulièrement gênant dans les applications sockets...

    En application de

    http://emmanuel-delahaye.developpez.com/reseaux.htm

    Je conseille ceci pour 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
    92
    93
    94
    95
     
    #if defined (WIN32)
    #include <winsock2.h>
    #elif defined (linux)
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #define INVALID_SOCKET -1
    #define SOCKET_ERROR -1
    #define closesocket(s) close (s)
    typedef int SOCKET;
    typedef struct sockaddr_in SOCKADDR_IN;
    typedef struct sockaddr SOCKADDR;
    #endif
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int client (void)
    {
    /* socket(famille du socket , type de socket , protocol) */
       SOCKET sock = socket (AF_INET, SOCK_STREAM, 0);
       if (sock != INVALID_SOCKET)
       {
    /* la structure qui contient les informations technique du socket */
          struct sockaddr_in sin;
    /* l'adresse de l'hote */
          char const *ip_destination = "127.0.0.1";
    /* le port que l'on veut observer */
          int port = 23;
     
    /* definition de l'adresse du serveur */
          sin.sin_addr.s_addr = inet_addr (ip_destination);
    /* la famille du socket */
          sin.sin_family = AF_INET;
    /* definition port que l'on veut observer */
          sin.sin_port = htons (port);
    /* connection du socket sur le port */
          if (connect (sock, (struct sockaddr *) &sin, sizeof (sin)) !=
              SOCKET_ERROR)
          {
    /* reception d'une eventuelle information envoyée par le serveur */
    /* buffer de stockage de l'information recue */
             char buffer[256];
     
             int n = recv (sock, buffer, sizeof buffer - 1, 0);
             if (n > 0)
             {
                buffer[n] = 0;
                printf ("recu = '%s'\n", buffer);
             }
             else if (n < 0)
             {
                printf ("erreur locale\n");
             }
             else
             {
                printf ("deconnexion distante\n");
             }
          }
          else
          {
             printf ("erreur connexion\n");
          }
     
    /* fermeture de la socket */
          closesocket (sock);
       }
       else
       {
          printf ("erreur socket\n");
       }
       return 0;
     
    }
     
    int main (void)
    {
    #if defined (WIN32)
       WSADATA WSAData;
       int erreur = WSAStartup (MAKEWORD (2, 0), &WSAData);
    #else
       int erreur = 0;
    #endif
       client ();
    #if defined (WIN32)
       WSACleanup ();
    #endif
       system ("pause");
     
       return 0;
    }
    Serveur

    L'exécution directe du serveur, puis du client, donne ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    recu = 'Message envoyÚ !
    '
    Appuyez sur une touche pour continuer...
    Je conseille ce code :
    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
     
    #if defined (WIN32)
    #include <winsock2.h>
    #elif defined (linux)
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #define INVALID_SOCKET -1
    #define SOCKET_ERROR -1
    #define closesocket(s) close (s)
    typedef int SOCKET;
    typedef struct sockaddr_in SOCKADDR_IN;
    typedef struct sockaddr SOCKADDR;
    #endif
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int serveur (void)
    {
    /* informations du socket serveur */
       struct sockaddr_in sin;
     
    /* socket(famille du socket , type de socket , protocol) */
       SOCKET sock = socket (AF_INET, SOCK_STREAM, 0);
     
       if (sock != INVALID_SOCKET)
       {
    /* le socket ecoutera n'importe quelle connection */
          sin.sin_addr.s_addr = INADDR_ANY;
    /* la famille du socket */
          sin.sin_family = AF_INET;
    /* le port utilisé */
          sin.sin_port = htons (23);
    /* connection du socket sur le port */
          bind (sock, (struct sockaddr *) &sin, sizeof (sin));
    /* le socket ecoute maintenant les connections */
          if (listen (sock, 0) != SOCKET_ERROR)
          {
             while (1)
             {
    /* informations du socket client */
                struct sockaddr_in csin;
     
    /* on stock la taille du socket client */
                unsigned int sinsize = sizeof (csin);
     
    /* on accept une connection au serveur */
                SOCKET csock = accept (sock, (struct sockaddr *) &csin, &sinsize);
     
                if (csock != INVALID_SOCKET)
                {
    /* on envoie un message au client */
                   char const *message = "Message envoye !\r\n";
                   send (csock, message, strlen (message), 0);
                }
                else
                {
                   printf ("erreur socket client\n");
                }
     
             }
          }
          else
          {
             printf ("erreur ecoute serveur\n");
          }
       }
       else
       {
          printf ("erreur socket serveur\n");
       }
       return 0;
     
    }
     
    int main (void)
    {
    #if defined (WIN32)
       WSADATA WSAData;
       int erreur = WSAStartup (MAKEWORD (2, 0), &WSAData);
    #else
       int erreur = 0;
    #endif
       serveur ();
    #if defined (WIN32)
       WSACleanup ();
    #endif
       system ("pause");
     
       return 0;
    }
    Attention, je rappelle que sous unixoïde, il faut avoir les droits root pour utiliser un port < 1024.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 195
    Par défaut
    merci beaucoup de cette reponse trés complete !
    le code fonctionne chez moi et je l'ai comparé au mien. il est vrai que je ne teste aucune valeur de retour mais j'ai cependant une question.
    quelle est la difference entre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int n = recv (sock, buffer, sizeof buffer - 1, 0);
             if (n > 0)
             {
                buffer[n] = 0;
                printf ("recu = '%s'\n", buffer);
             }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    recv (sock, buffer, sizeof buffer - 1, 0);
    printf ("recu = '%s'\n", buffer);
    en effet dans le premier cas cela me semble plus propre mais le deuxieme cas devrait fonctionner si l'envoie d'un message a effectivement lieu....
    hormis cette difference je ne vois pas encore pourquoi mon ancien code n'etait pas fonctionnel !
    merci

  4. #4
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    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
    /* reception d'une eventuelle information envoyée par le serveur */
       int n = recv (sock, buffer, sizeof buffer - 1, 0);
       if (n > 0)
       {
          buffer[n] = 0;
          printf ("recu = '%s'\n", buffer);
       }
       else if (n < 0)
       {
          puts("erreur locale");
       }
       else
       {
          puts("deconnexion distante");
       }
    Citation Envoyé par nightwar Voir le message
    quelle est la difference entre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int n = recv (sock, buffer, sizeof buffer - 1, 0);
             if (n > 0)
             {
                buffer[n] = 0;
                printf ("recu = '%s'\n", buffer);
             }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    recv (sock, buffer, sizeof buffer - 1, 0);
    printf ("recu = '%s'\n", buffer);
    Dans ton code, tu demandes à afficher une chaine de caractère qui n'est pas terminé par '\0', donc la fonction printf() va continuer d'afficher les caractères jusqu'à trouver un 0 sur la pile : pas terrible; voila pourquoi Emmanuel fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sizeof buffer - 1
    ...
    buffer[n] = 0;
    il garde une place pour le zéro final, et il le place.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 195
    Par défaut
    sa j'ai bien compris c'etait aussi une de mes erreur.
    mais dans ces cas la je n'aurais pas du voir sur la sortie standard ma chaine de caractere + des caractere bizzar correspondant aux espaces memoires lue ensuite? dumoin jusqu'a un eventuel \0
    moi je n'observai absolument rien sur la sortie...
    je cherche jsute a comprendre :p

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par nightwar Voir le message
    sa j'ai bien compris c'etait aussi une de mes erreur.
    mais dans ces cas la je n'aurais pas du voir sur la sortie standard ma chaine de caractere + des caractere bizzar correspondant aux espaces memoires lue ensuite? dumoin jusqu'a un eventuel \0
    moi je n'observai absolument rien sur la sortie...
    je cherche jsute a comprendre :p
    Le comportement était indéterminé. Il n'y a pas grand chose à comprendre.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 18/04/2007, 14h26
  2. Communication client/serveur: recherche d'une solution
    Par Razmoket dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 20/03/2007, 17h57
  3. [ServerSocket]Problème communication client-serveur udp sur linux
    Par gdecrouez dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 29/09/2006, 14h59
  4. Problème de communication client/serveur
    Par alex6891 dans le forum Développement
    Réponses: 10
    Dernier message: 09/03/2006, 13h12
  5. [Architecture] communication client/serveur client/client
    Par daed dans le forum Général Java
    Réponses: 4
    Dernier message: 28/01/2006, 23h23

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