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

Développement Discussion :

client/serveur tcp/ip en c sous unix


Sujet :

Développement

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2005
    Messages : 304
    Points : 53
    Points
    53
    Par défaut client/serveur tcp/ip en c sous unix
    Hello, j'ai un debut de client/serveur : le client entre un message, le serveur le recois, en envois un au client et ca s'arrete la, alors que j'aimerais qu'ils puissent coninuer a s'envoyer des messages! Mais je ne sais pas quoi faire pour cela (j'ai essayé en ajoutant une boucle dans le client mais ca ne marche pas...)

    voici le code 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
    int sd;
    struct sockaddr_in serveur;
    //struct hostent *hp;
    char buf[256];
    
    sd=socket(AF_INET,SOCK_STREAM,0);
    
    struct hostent *hp      = NULL; /* gethostbyname return a structure of this type */
    int ret                 = 0;         /* to get the return values */
    char hostname[256]      = ""; /* Will contain the hostname, returned by gethostname(...)*/
    	       
    int nb_char             = 0;      /* Number of char written. Used to get result of sprintf */
    
    /* Initialisation */
    sethostent (1); /* Initialisation of host list*/
    
    ret = gethostname (hostname, 256); /* set hostname string */
    
    hp = gethostbyname (hostname); /* fill the 'hp' struct */
    			   
    serveur.sin_family=AF_INET;
    bcopy( (char *)hp->h_addr, (char *)&serveur.sin_addr, hp->h_length);
    serveur.sin_port=htons(S_PORT);
    
    connect(sd, (struct sockaddr *)&serveur, sizeof(serveur));
    printf("---- enter string : \n");
    scanf("%s",buf);
    
    write(sd,buf,sizeof(buf));
    read(sd,buf,sizeof(buf));
    
    printf("---- string en retour : %s\n",buf);
    }
    close(sd);
    }
    et le code 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
    int sd,nsd,ret;                 /* socket descriptors */
    struct sockaddr_in serveur;     /* structure serveur  */
    struct sockaddr *client;        /* structure client   */
    char buf[256];
    int client_size = sizeof(struct sockaddr); /* NOUVEAU */
    
    sd=socket(AF_INET,SOCK_STREAM,0);
    if &#40;sd <0&#41; &#123; perror&#40;"SOCKET"&#41;; exit&#40;1&#41;; &#125;
    
    serveur.sin_family=AF_INET;
    serveur.sin_addr.s_addr=htons&#40;INADDR_ANY&#41;;
    serveur.sin_port=htons&#40;S_PORT&#41;;
    
    ret=bind&#40;sd,&#40;struct sockaddr *&#41;&serveur,sizeof&#40;serveur&#41;&#41;;
    if &#40;ret <0&#41; &#123; perror&#40;"BIND"&#41;; exit&#40;1&#41;; &#125;
    
    ret=listen&#40;sd,10&#41;;
    if &#40;ret <0&#41; &#123; perror&#40;"LISTEN"&#41;; exit&#40;1&#41;; &#125;
    
    while &#40;1==1&#41;
    	&#123;
    	/*nsd=accept&#40;sd,client,&client_size&#41;;   /* NOUVEAU ->pour antares?*/
    	nsd=accept&#40;sd,&#40;struct sockaddr*&#41;&client,&client_size&#41;;
            if &#40;nsd <0&#41; &#123; perror&#40;"ACCEPT"&#41;; printf&#40;"ERRNO=%d\n", errno&#41;; exit&#40;1&#41;; &#125;
    
    	ret=read&#40;nsd,buf,sizeof&#40;buf&#41;&#41;;
            if &#40;ret <0&#41; &#123; perror&#40;"READ"&#41;; exit&#40;1&#41;; &#125;
    
    	printf&#40;"%s",buf&#41;;	
    	scanf&#40;"%s",buf&#41;;
    	 //buf&#91;0&#93;='X'; buf&#91;1&#93;='Y'; buf&#91;2&#93;='Z';
    
    	ret=write&#40;nsd,buf,sizeof&#40;buf&#41;&#41;;
            if &#40;ret <0&#41; &#123; perror&#40;"WRITE"&#41;; exit&#40;1&#41;; &#125;
    
    	close&#40;nsd&#41;;
    	&#125;
    close&#40;sd&#41;;
    mc!

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2005
    Messages : 304
    Points : 53
    Points
    53
    Par défaut
    ok, c bon j'arrive maintenant à envoyer autant de messages que je veux mais je ne sais pas comment faire pour que pendant que le client (ou le serveur) tape un message, le serveur (ou le client) puisse en recevoir un. Peut etre faire un fork?
    mc

  3. #3
    Membre régulier
    Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juillet 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 89
    Points : 106
    Points
    106
    Par défaut
    Oui avec un fork c'est possible j'avais fais comme ça au début avec de passer au multithreading.
    Tu fais une boucle qui se bloque sur un fgets et une autre sur un recv, si tu sais pas comment faire jpeux te donner un exemple..

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2005
    Messages : 304
    Points : 53
    Points
    53
    Par défaut
    euh, ouai je veux bien un pti exemple, je maitrise pas trop les fork en fait, je connais juste le principe en gros
    merci

  5. #5
    Membre régulier
    Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juillet 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 89
    Points : 106
    Points
    106
    Par défaut
    Pour créer un processus fils tu fais:
    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
    
    int main&#40;void&#41; &#123;
       int child;
    
       /*Création du processus fils*/
       if&#40;&#40;child=fork&#40;&#41;&#41;<0&#41; 	//Si erreur
    	printf&#40;"\nError Fork"&#41;;
       if&#40;&#40;writepid=fork&#40;&#41;&#41;==0&#41; //Si ça marche
    		write&#40;&#41;; //Processus fils execute fonction write
       while&#40;1==1&#41; &#123;
          &#40;...&#41; //Processus parent ici
       &#125;
       return&#40;0&#41;;
    &#125;
    
    int write&#40;void&#41; &#123; //Execute par le processus fils
       while&#40;1==1&#41; &#123;
          fgets...
       &#40;...&#41;
       &#125;
    &#125;
    Voilà les grandes lignes on remarque que deux boucles infinis sont executées en même temps (une par le processus parent et l'autre par le processus fils). Tu peux créer plusieurs processus ils si tu veux.

    Si tu comprens pas quelque chose, dit le moi

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2005
    Messages : 304
    Points : 53
    Points
    53
    Par défaut
    arf ca marche pas trop , voila ce que j'ai fait :

    dans 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
    nsd=accept&#40;sd,&#40;struct sockaddr*&#41;&client,&client_size&#41;;
    
    while &#40;1==1&#41;
    &#123;
    	 int pid;
             pid=fork&#40;&#41;;
      	 if &#40;pid ==0&#41; &#123;
                 /* fils */          /* Le fils gere la connexion */
    		ret=read&#40;nsd,buf,sizeof&#40;buf&#41;&#41;;//reception des données du client
    		printf&#40;"client&#58; %s\n",buf&#41;;
    		printf&#40;"serveur&#58; "&#41;;
    		scanf&#40;"%s",buf&#41;;
            	ret=send&#40;nsd,buf,sizeof&#40;buf&#41;,0&#41;;//envoie des données au client
             &#125;
             else &#123;
                 /* parent */        
                 close &#40;nsd&#41;;
    	     nsd=accept&#40;sd,&#40;struct sockaddr*&#41;&client,&client_size&#41;;
                 return 0;
             &#125;
    	
    &#125;
    et dans 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
    while&#40;1==1&#41;&#123;
    	 connect&#40;sd, &#40;struct sockaddr *&#41;&serveur, sizeof&#40;serveur&#41;&#41;;
     	 int pid;
             pid=fork&#40;&#41;;
      	 if &#40;pid ==0&#41; &#123;
                 /* fils */      
    	        while&#40;1==1&#41; &#123;
    		printf&#40;"client&#58; "&#41;;
    		scanf&#40;"%s",buf&#41;;
            	send&#40;sd,buf,sizeof&#40;buf&#41;,0&#41;;//envoi de ce qu'on a ecrit au serveur
    		&#125;
                &#125;
             else &#123;
                 /* parent */        
    	     while&#40;1==1&#41; &#123;
    	     recv&#40;sd,buf,sizeof&#40;buf&#41;,0&#41;;//reception des données du serveur
    	     printf&#40;"serveur&#58; %s\n",buf&#41;;
    	     &#125; 
             &#125;
    &#125;

  7. #7
    Membre régulier
    Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juillet 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 89
    Points : 106
    Points
    106
    Par défaut
    Enfaite le problème(dans le serveur) est que les lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    else &#123;
            /* parent */       
            close &#40;nsd&#41;;
            nsd=accept&#40;sd,&#40;struct sockaddr*&#41;&client,&client_size&#41;;
            return 0;
    &#125;
    sont executés seulement si l'appel fork() a échoué..

    Je te conseil de faire comme dans mon programme et de créer une fontion pour l'écriture, une pour la lecture (et une pour accept() dans le cas du serveur) de manière a dejà mieu t'en sortir , et d'avoir un code plus lisible

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2005
    Messages : 304
    Points : 53
    Points
    53
    Par défaut
    c bon ca marche
    encore merci pour ton aide

  9. #9
    Membre régulier
    Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juillet 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 89
    Points : 106
    Points
    106
    Par défaut
    On galère tous plus ou moin au début

    Mer ci de penser au tag "résolus"

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

Discussions similaires

  1. [C] Probleme avec socket client-serveur TCP
    Par LinuxUser dans le forum Réseau
    Réponses: 33
    Dernier message: 15/05/2007, 23h26
  2. Aide Client/Serveur TCP //Commentaire
    Par sebounty dans le forum Réseau
    Réponses: 1
    Dernier message: 27/04/2007, 10h19
  3. [Reseau] probleme client/serveur TCP LInux
    Par jmjmjm dans le forum Réseau
    Réponses: 20
    Dernier message: 03/12/2006, 20h32
  4. [C#] Problème client-serveur TCP
    Par LE NEINDRE dans le forum Windows Forms
    Réponses: 7
    Dernier message: 02/06/2006, 17h23
  5. Réponses: 1
    Dernier message: 11/05/2006, 12h46

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