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 :

probleme read write serveur/client


Sujet :

Réseau C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 52
    Points : 34
    Points
    34
    Par défaut probleme read write serveur/client
    bjr,

    voila je doi realiser un serveur/client en tcp et pour le moment je voudrai deja essayer que le client enoye la date et l'heure au serveur puis que le serveur l'affiche.
    j'utilise les methodes read et write mais le probleme est que le serveur affiche le message en boucle, voici le 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
     
    #include	<stdio.h>
    #include	<sys/types.h>
    #include	<sys/socket.h>
    #include	<netinet/in.h>
    #include	<arpa/inet.h>
     
    #define MASOCKET 1200
    #define MAX 512
     
    main(){
     
    	char			buff[MAX];
    	time_t			tics;
    	int 			sock;
    	struct sockaddr_in	serv_addr;
     
    	bzero(&serv_addr, sizeof(serv_addr));
     
    	serv_addr.sin_family		= AF_INET;
    	serv_addr.sin_addr.s_addr	= inet_addr("193.50.49.96");
    	serv_addr.sin_port		= htons(MASOCKET);
     
    	if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0){
    		perror("Client->can't open stream socket");
    		exit(1);
    	}
     
    	if (connect(sock, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0){
    		perror("Client->can't connect to server");
    		exit(1);
    	}
     
    	tics = time(NULL);     
           snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&tics)); 
     
     
            if (write(sock, buff, strlen(buff)) < 0){      
                perror("write error"); 
                exit(1);    
    	} 
     
    	close(sock);
    	exit(0);
    }


    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
     
    #include	<stdio.h>
    #include	<sys/types.h>
    #include	<sys/socket.h>
    #include	<netinet/in.h>
    #include	<sys/un.h>
    #include	<arpa/inet.h>
     
    #define MASOCKET 1200
    main(){
     
    	int 	sock, newsock, childpid;
    	struct sockaddr_in serv_addr, client_addr; 
     
    	if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0){
    		perror("Serveur->Socket error");
    		exit(1);
    	}
     
    	bzero(&serv_addr, sizeof(serv_addr));
    	serv_addr.sin_family		= AF_INET;
    	serv_addr.sin_addr.s_addr	= htonl(INADDR_ANY);
    	serv_addr.sin_port		= htons(MASOCKET);
     
    	if(bind(sock, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0){
    		perror("Serveur->Bind error");
    		exit(1);
    	}
     
    	if(listen(sock, 9) < 0){
    		perror("Serveur->Listen error");
    		exit(1);
    	}
     
    	while(1){
     
    		perror("bbb");
    		newsock = accept(sock, (struct sockaddr *) NULL, NULL);
     
    		if (newsock < 0){
    			perror("Server->Accept error");
    			exit(1);
    		}
     
    		if ( (childpid = fork()) < 0){		//echec création du fils
    			perror("Serveur->Fork error");
    			exit(1);
    		}
     
    		else if (childpid == 0){			//on est dans le fils
    			close(sock);				
    			perror("aaa");			
    			ecoute(newsock);			
    			exit(0);				
    		}						
    		close(newsock);		
    	}
    }

    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
     
    #define MAX 512
     
    ecoute(sock)
     
    int sock;
     
    {
    	char	recvline[MAX];
    	int 	n;
     
    	while(1){
     
     
    		while((n = read(sock, recvline, MAX)) > 0)
     
    			recvline[n]=0;
     
    		if (fputs(recvline, stdout) == EOF){ 
    			perror("fputs error"); 
                		exit(1); 
            	} 
    	}
    }

    avez vous uhne idée merci

  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 romainromain
    avez vous uhne idée merci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	char	recvline[MAX];
    	int 	n;
     
    	while(1){
    		while((n = read(sock, recvline, MAX)) > 0)
    			recvline[n]=0;
    Algorithme plutôt douteux... Il ne manque pas des { } ? Admettons. Mais le plus grave est ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		while((n = read(sock, recvline, MAX - 1)) > 0)
    En effet, il faut ménager une place pour le zéro.

    Et puis read() / write(), pour des sockets, c'est plutôt fumeux. recv() /send () est plus adapté...

    Nota, cette technique de réception ne fonctionne que pour du texte, on est bien d'accord ?

    Au fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ecoute(sock)
     
    int sock;
     
    {
    J'ai cru à un code incomplet... On ne code plus comme ça depuis 1989... On utilise les prototypes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int ecoute (int sock)
    {
       ...
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 52
    Points : 34
    Points
    34
    Par défaut
    merci pour ta reponse mais cela dit j'ai toujours l'heure qui s'affiche en boucle dans le serveur alors que je voudrais juste l'affcicher une fois et que apres le serveur continu d'ecouter les les messages entrant.

  4. #4
    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 romainromain
    merci pour ta reponse mais cela dit j'ai toujours l'heure qui s'affiche en boucle dans le serveur alors que je voudrais juste l'affcicher une fois et que apres le serveur continu d'ecouter les les messages entrant.
    Ben oui, vu qu'il y a 3 boucles imbriquées... , il ne peut pas faire autrement que de boucler...

    Ceci fonctionne :
    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
     
    /* client.c */
    #include	<stdio.h>
    #include	<time.h>
     
    #ifdef WIN32
    #include	<winsock2.h>
    #define bzero(a,b) memset (a,0,b)
    #define close(a) closesocket((SOCKET)a)
    #define IP "127.0.0.1"
    #else
    #include	<sys/types.h>
    #include	<sys/socket.h>
    #include	<netinet/in.h>
    #include	<arpa/inet.h>
    #define IP "193.50.49.96"
    #endif
     
    #define MASOCKET 1200
    #define MAX 512
     
    int main (void)
    {
    #ifdef WIN32
     
       WSADATA wsa_data;
       int err = WSAStartup (MAKEWORD (2, 2), &wsa_data);
     
       if (!err)
       {
          puts ("WIN: winsock2: OK");
    #else
       {
          int err;
    #endif
       char buff[MAX];
       time_t tics;
       int sock;
       struct sockaddr_in serv_addr;
     
       bzero (&serv_addr, sizeof (serv_addr));
     
       serv_addr.sin_family = AF_INET;
       serv_addr.sin_addr.s_addr = inet_addr (IP);
       serv_addr.sin_port = htons (MASOCKET);
     
       if ((sock = socket (AF_INET, SOCK_STREAM, 0)) < 0)
       {
          perror ("Client->can't open stream socket");
          exit (1);
       }
     
       if (connect (sock, (struct sockaddr *) &serv_addr, sizeof (serv_addr)) < 0)
       {
          perror ("Client->can't connect to server");
          exit (1);
       }
     
       tics = time (NULL);
       snprintf (buff, sizeof (buff), "%.24s\r\n", ctime (&tics));
     
     
       if (send (sock, buff, strlen (buff), 0) < 0)
       {
          perror ("write error");
          exit (1);
       }
     
       close (sock);
    #if defined (WIN32)
          WSACleanup ();
    #endif
       }
    }
    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
     
    /* serveur.c */
    #include <stdio.h>
    #include <stdlib.h>
     
    #ifdef WIN32
    #include <winsock2.h>
    #define bzero(a,b) memset (a,0,b)
    #define close(a) closesocket((SOCKET)a)
    #else
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <sys/un.h>
    #include <arpa/inet.h>
    #endif
     
    #define MASOCKET 1200
    #define MAX 512
     
    static void ecoute (int sock)
    {
       char recvline[MAX];
       int n = recv (sock, recvline, MAX, 0);
     
       if (n > 0)
       {
          recvline[n] = 0;
     
          if (fputs (recvline, stdout) == EOF)
          {
             perror ("fputs error");
             exit (1);
          }
       }
    }
     
    int main (void)
    {
       int ret;
       int sock, newsock, childpid;
       struct sockaddr_in serv_addr, client_addr;
     
    #ifdef WIN32
     
       WSADATA wsa_data;
       int err = WSAStartup (MAKEWORD (2, 2), &wsa_data);
     
       if (!err)
       {
          puts ("WIN: winsock2: OK");
    #else
       {
          int err;
    #endif
     
          if ((sock = socket (AF_INET, SOCK_STREAM, 0)) < 0)
          {
             perror ("Serveur->Socket error");
             exit (1);
          }
     
          bzero (&serv_addr, sizeof (serv_addr));
          serv_addr.sin_family = AF_INET;
          serv_addr.sin_addr.s_addr = htonl (INADDR_ANY);
          serv_addr.sin_port = htons (MASOCKET);
     
          if (bind (sock, (struct sockaddr *) &serv_addr, sizeof (serv_addr)) < 0)
          {
             perror ("Serveur->Bind error");
             exit (1);
          }
     
          if (listen (sock, 9) < 0)
          {
             perror ("Serveur->Listen error");
             exit (1);
          }
     
          while (1)
          {
             perror ("bbb");
             newsock = accept (sock, (struct sockaddr *) NULL, NULL);
     
             if (newsock < 0)
             {
                perror ("Server->Accept error");
                exit (1);
             }
     
    #ifdef WIN32
             ecoute (newsock);
    #else
     
             if ((childpid = fork ()) < 0)
             {                      //echec création du fils
                perror ("Serveur->Fork error");
                exit (1);
             }
     
             else if (childpid == 0)
             {                      //on est dans le fils
                close (sock);
                perror ("aaa");
                ecoute (newsock);
                exit (0);
             }
    #endif
     
             close (newsock);
          }
    #if defined (WIN32)
          WSACleanup ();
    #endif
       }
     
       if (err)
       {
          ret = EXIT_FAILURE;
       }
       else
       {
          ret = EXIT_SUCCESS;
       }
     
       return ret;
    }
    Si le problème vient du fork() (pas de fork() sous Windows), voir sur le forum unixoide.

    http://www.developpez.net/forums/forumdisplay.php?f=16
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 52
    Points : 34
    Points
    34
    Par défaut
    merci de ta reponse je la regarde en detail dans 10 min mais pour information je travail sous unix
    merci

  6. #6
    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 romainromain
    merci de ta reponse je la regarde en detail dans 10 min mais pour information je travail sous unix
    J'avais compris. Le code est compatible...
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 52
    Points : 34
    Points
    34
    Par défaut
    je connai depuis peu le c et j'avoue ne pas comprendre se que tu as rajouté mais en fait je voulai que le serveur puisse gerer plusieurs client en meme temps enfin bon je vais reprendre tout ça et je me creuser la tete....merci

  8. #8
    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 romainromain
    je connai depuis peu le c et j'avoue ne pas comprendre se que tu as rajouté mais en fait je voulai que le serveur puisse gerer plusieurs client en meme temps enfin bon je vais reprendre tout ça et je me creuser la tete....merci
    Tu fais de la programmation réseau et tu "connai depuis peu le c" ? Y'a pas un truc incompatible, là ?

    Pour que le serveur soit multi-client, oui, sous unixoide, tu peux utiliser fork(). Mais comme je te l'ai dit, j'ai testé ton code sous Windows, et je n'ai pas de fork(). Je t'ai déjà indiqué le repaire des spécialistes...
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 52
    Points : 34
    Points
    34
    Par défaut
    merci pour ton aide mais effectivement ça fait 2 semaine que je connai le c et je doi faire un projet pour mes etudes alors voila merci je v reprendre tout ce que tu m'a dit et........faire ce que je peux

  10. #10
    Membre confirmé Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Points : 489
    Points
    489
    Par défaut
    Essayes de travailler sur celui-là, à peu près aussi crade que celui du dessus - mais qui fonctionne. http://www.developerweb.net/forum/sh...ad.php?p=16590

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

Discussions similaires

  1. probleme envoi donnees serveur/client
    Par Romanzo_Criminale dans le forum C++
    Réponses: 5
    Dernier message: 24/09/2009, 23h20
  2. ODBC probleme de connexion du client LINUX --> serveur windows
    Par lmdpedat dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 05/07/2006, 11h32
  3. ODBC probleme de connexion du client LINUX --> serveur windows
    Par lmdpedat dans le forum Installation
    Réponses: 5
    Dernier message: 29/06/2006, 16h33
  4. Réponses: 7
    Dernier message: 29/06/2006, 15h20
  5. [C++] Probleme de connexion socket client à mon serveur smtp
    Par matthieu5978 dans le forum Développement
    Réponses: 2
    Dernier message: 04/12/2005, 08h19

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