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 :

Problème de communication client/serveur


Sujet :

Développement

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Points : 44
    Points
    44
    Par défaut Problème de communication client/serveur
    Bonjour,

    J'ai programmé en C sous linux un serveur et un client pouvant y accèder. Pour l'instant, une fois la connexion au serveur detéctée, le serveur délègue le travail à un processus fils (fork) tandis que le père reste à l'écoute du port spécifié (cas ou plusieurs clients se connectent en simultané).

    Le problème c'est que je ne sais pas comment m'y prendre pour que le client connecté continue de dialoguer avec le serveur (envoi de données et reception de données) mais avec le processus fils créé pas le père...?

    Merci pour votre aide!

    PS: j'utilise les sockets.

    Alex

  2. #2
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 681
    Points
    18 681
    Par défaut
    as-tu déjà eu un cours sur les sockets ?

    http://www.ensta.fr/~gueydan/rubriqu...?id_rubrique=2

    regardes plus particulièrement ce point...
    http://www.ensta.fr/~gueydan/Poly/Html/node17.html

    avec un petit exemple qui fait ce que tu souhaites

    http://www.ensta.fr/~gueydan/Poly/Src/serveur.c
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Points : 44
    Points
    44
    Par défaut
    Merci beaucoup gorgonite mais j'ai déjà programmé avec les sockets un serveur qui fonctionne, mon problème vient du fait qu'une fois connecté et le processus fils lancé, il m'est impossible de récupèrer les données en provenance du client...

  4. #4
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 681
    Points
    18 681
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    le processus fils lancé, il m'est impossible de récupèrer les données en provenance du client...
    ben suffit juste de lire et d'ecrire dans une socket... comme avec un descripteur de fichier standard
    je ne vois vraiment pas le probleme...
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  5. #5
    Membre expérimenté
    Avatar de Aramis
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 493
    Points : 1 638
    Points
    1 638
    Par défaut
    Bonsoir,

    peu etre un morceau de code pourrai aide les forumeurs. Je pense en particulier au morceau qui montre les details passes au processus fils.

    A.
    Avant de Poster Lire les Regles! Merci
    -------------------------------------------------
    "The only Way for Evils to Triumph is for Good Men to Do Nothing"
    Edmund Burke (1729 - 1797)

  6. #6
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Points : 44
    Points
    44
    Par défaut
    Oui Aramis, voici un extrait du code côté serveur pour la délégation au processus fils (c'est le main du serveur) :


    int main(int argc, char * argv[]) {
    int fdTravail;

    /* positionnement du signal d'interruption */
    signal(SIGINT, interruption);

    /*initialisation du service*/
    fd = init_service(PORT);

    /*gestion des connexionsde clients*/
    while(1){
    /*acceptation d'une connexion*/
    fdTravail = accept(fd,NULL,NULL);
    if (fdTravail < 0)
    FATAL("accept");


    if (fork() == 0){ /*fils: gestion du dialogue avec le client*/
    close(fd);
    printf("Connexion entrante acceptée\n");
    travail_fils(fdTravail);
    close(fdTravail);
    exit(0);
    }
    else{ /*père: repart à l'écoute d'une autre connexion*/
    close(fdTravail);
    }
    }
    }
    Merci.

  7. #7
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 681
    Points
    18 681
    Par défaut
    tu ne gères pas le cas fork()==-1 !!!

    avec le résultat de accept(), tu peux faire des write/read ou alors créer un FILE* avec fdopen()
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  8. #8
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Points : 44
    Points
    44
    Par défaut
    Oui mais ça c'est côté serveur... Côté client je fais comment (parce que je n'ai pas connaissance du fdTravail...) ?

    Merci

  9. #9
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Points : 44
    Points
    44
    Par défaut
    Personne ne peut m'aider?

  10. #10
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    Côté client normalement tu te connectes au serveur (en connaissant son port et son ip) avec la fonction connect qui te renvoi une socket.
    Tu n'as qu'a écrire sur cette socket a partir du client et lire dans la socket ( renvoyé par accept) dans le serveur...
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  11. #11
    Membre expérimenté
    Avatar de Aramis
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 493
    Points : 1 638
    Points
    1 638
    Par défaut
    Bonjour,

    Il y a plusieurs moyens de creer, et maintenir une bonne communication client/server. Par "bonne", je veux dire que les deux applications peuvent echanger des informations.

    La premiere solution est comme decrite dans ce sujet: Le server cree un processus secondaire pour chaque client. Cela necessite d'ouvrir d'autres sockets (sinon read error et etc.). Du coup, le client doit etre code pour recevoir d'autre information sur la communication en l'occurence le changement de socket. Ayant utilise cette technique avec Java, je dois avouer que cette solution n'est pas desirable car le code devient vite difficile a maintenir. Cela etant dit je ne suis pas une pointe en programmation et je deteste Java. Cependant, la solution decrite ici n'est pas bonne car elle ne n'utilise pas les avatanges offerts par une bonne programmation en multi-threads.

    La deuxieme solution est d'utilise des threads qui reposent sur le socket qui est deja ouvert. Pensez-y! Les server Web recevoivent et gerent les connexions sur un seul port ! la communication est faite unique avec la forumule suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    client IP&#58; Client Port <-----> serverIP&#58; server Port
    Sachant que les clients ouvrent TOUJOURS un port choisi au hasard par le systeme d'exploitation, le server reconnait ou doivent aller les informations. Et ce ci meme si le client ouvre plusieurs connexions.

    C'est mon experience que cette utilisation des threads rend la maintenance des applications plus facile. Cependant, je ne l'ai jamais fait en C. Je suis certain qu'il existe de tres bon code qui permet d'utiliser la methode decrite ici en C.

    En esperant que cela aide,

    Cordialement

    Ar@mi$
    Avant de Poster Lire les Regles! Merci
    -------------------------------------------------
    "The only Way for Evils to Triumph is for Good Men to Do Nothing"
    Edmund Burke (1729 - 1797)

Discussions similaires

  1. [Débutant] Problème lors de la communication client/serveur
    Par zetsu00 dans le forum Services Web
    Réponses: 4
    Dernier message: 26/07/2012, 11h56
  2. Problème de communication client-serveur!
    Par nixmind dans le forum Windows XP
    Réponses: 1
    Dernier message: 29/08/2009, 13h29
  3. Problème de communication client-serveur!
    Par nixmind dans le forum Services
    Réponses: 1
    Dernier message: 29/08/2009, 13h16
  4. Socket - Problème de communication client/serveur
    Par Arkinou dans le forum Réseau
    Réponses: 4
    Dernier message: 31/05/2007, 15h01
  5. [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

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