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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 52
    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
    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 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)
    {
       ...

  3. #3
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 52
    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
    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 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

  5. #5
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 52
    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
    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 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...

+ 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