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 :

Question Serveur Multithread


Sujet :

Réseau C

  1. #1
    Membre régulier

    Inscrit en
    Avril 2004
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 78
    Points : 74
    Points
    74
    Par défaut Question Serveur Multithread
    Bonsoir,

    J aimerais faire un server multithread.
    J en est deja fait en Java mais en C je pense que c est une autre paire de manches ^^.

    En java, j avais l 'habitude de lancer un thread que le serveur recevait un message. cela donnée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    while (true)
    <div style="margin-left:40px">new ThreadServer(serverSocket.accept(), this);</div>
    Je me demander si c etait possible en C.
    Sinon je peux faire a chaque reception d'un message, je le donne a un thread qui le traitera.
    Ce que je voulais surtout savoir si les methodes pour lire et ecrire sur la socket sont safe comme en java, ou si on a besoin de semaphores.

    Dernieres petites choses :
    - Je suis habitué en java a envoyer des objets serialises. Si je veux envoyer (en C) par socket une structure. or en C on e peut renvoyé et récuprer ue des chaines de caracteres. Que me conseillez vous pour envoyer et recevoir les donnees d une structure ?


    Merci pour vous reponse.

  2. #2
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Citation Envoyé par Mr_Chut
    Bonsoir,

    J aimerais faire un server multithread.
    J en est deja fait en Java mais en C je pense que c est une autre paire de manches ^^.
    Oui
    Citation Envoyé par Mr_Chut
    En java, j avais l 'habitude de lancer un thread que le serveur recevait un message. cela donnée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    while (true)
    <div style="margin-left:40px">new ThreadServer(serverSocket.accept(), this);</div>
    Je me demander si c etait possible en C.
    Oui. La lib pthread permet de faire du multithreading de maniere assez simple.

    On peut creer des threads en definissant leur point d'entree et les donnes qu'ils recoivent avec pthread_create(3) par exemple.

    Citation Envoyé par Mr_Chut
    Sinon je peux faire a chaque reception d'un message, je le donne a un thread qui le traitera.
    Ce que je voulais surtout savoir si les methodes pour lire et ecrire sur la socket sont safe comme en java, ou si on a besoin de semaphores.
    Safe ? Tu veux dire par la si tes ressources sont automatiquement verrouilles ?
    En C j'en doute. Il faut sans doute passer par des semaphores/mutex si plusieurs threads doivent acceder au meme socket (ex: UDP). Mais la je peux me gourer.
    Citation Envoyé par Mr_Chut
    Dernieres petites choses :
    - Je suis habitué en java a envoyer des objets serialises. Si je veux envoyer (en C) par socket une structure. or en C on e peut renvoyé et récuprer ue des chaines de caracteres. Que me conseillez vous pour envoyer et recevoir les donnees d une structure ?
    Tu peux envoyer une structure a travers une socket, et la recuperer de l'autre cote assez simplement. Mais c'est moins ludique qu'en Java. (j'ai aussi fait un serveur en Java je connais )

    Les fonctions qui peuvent te servir :
    socket(2), bind(2), listen(2), send(2) + recv(2) pour du connecte, sendto(2) et recvfrom(2) pour du non-connecte, plus htonl(3), htons(3), ntohl(3), ntohs(3) pour les problemes d'endianness.


    Merci pour vous reponse.
    De rien et bonne nuit!
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

  3. #3
    Membre averti Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Points : 301
    Points
    301
    Par défaut
    Safe ? Tu veux dire par la si tes ressources sont automatiquement verrouilles ?
    En C j'en doute. Il faut sans doute passer par des semaphores/mutex si plusieurs threads doivent acceder au meme socket (ex: UDP). Mais la je peux me gourer
    Tu te gourres pas (ou alors mon prof se gourre aussi du coup ^^)

    Faut passer par des mutex etc...

    Bon courage
    define: Programmeur : Celui qui résout un problème que vous n'aviez pas, d'une façon que vous ne comprenez pas.

  4. #4
    Membre régulier

    Inscrit en
    Avril 2004
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 78
    Points : 74
    Points
    74
    Par défaut
    je pense deja faire un server tout simple. Une fois qu il marche, je mettrai le multithreading. A mon avis c est ce qu il y a de mieux a faire pour le debuggage. Surtout pour moi qui suis pas tres habitué a creer des clients et serveurs en C .

    Par contre au sujet des envoie de structures, j ai vu qu on povait utiliser les RPC. Je suis entrain de regarder .... et c pas aussi simple que je le pensai (c'est en effet "moins ludique"). Sinon vous avez une autre idee pour ca ^^ je suis tout ouie.

  5. #5
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 38
    Points : 43
    Points
    43
    Par défaut
    Pour envoyer ta structure, tu as essayer d'envoyer la zone mémoire occupée par ta structure? Car il me semble que send et receive travaillent sur des (void *)...
    Donc du coup, du coté recepteur, avec un cast, ça doit marcher...

    EDIT:

    Pour ce qui est de commencer une version monothread, si tu maitrise pas, c'est ce que tu as de mieux à faire. Ensuite une fois que c'est au point, tu passe en multithread. Mais si jamais tu attaque le multithread d'entrée, je te conseil de monter un ptit dossier beton avec tous les cas de figures, notement pour ce qui est du partage des ressources et variables... Je te dis ça car j'ai eu un jour la mauvaise idée de bacler un peu l'etude et je te raconte pas les galeres ensuite!!!!

    Bonne continuation...

  6. #6
    Membre régulier

    Inscrit en
    Avril 2004
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 78
    Points : 74
    Points
    74
    Par défaut
    olala autant pour moi, je sais pas pourquoi mais j etais sur que c etait avec un char *. Bref ca m apprendra a pas regarder le man pour verifier.

  7. #7
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    Citation Envoyé par Buendon
    Pour envoyer ta structure, tu as essayer d'envoyer la zone mémoire occupée par ta structure? Car il me semble que send et receive travaillent sur des (void *)...
    Donc du coup, du coté recepteur, avec un cast, ça doit marcher...
    je pense (mais ca ne regarde que moi) que c'est une tres mauvais conception ...
    la representation memoire d'une structure (ou meme d'un int, float ...) d'une architecture a l'autre as de grande (je dirai meme TRES grandes) chances d'etre differente.
    entre les bits de padding, l'endianess, la taille des variables (C ne garanti qu'une taille minimale) ...
    passons par des chaines de caractére... c'est achement plus simple ...
    quitte a faire du BER ou autre ...

    edit: avant de te lancer dans un server multithread et tout ce que ca impose au niveau 'complexité' (mutex entre autre) je te conseillerais de regarder du coté de la fonction select, qui permet ""d'ecouter sur plusieurs sockets a la fois"".
    http://beej.us/guide/bgnet/output/ht...ed.html#select
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  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 Mr_Chut
    Par contre au sujet des envoie de structures, j ai vu qu on povait utiliser les RPC. Je suis entrain de regarder .... et c pas aussi simple que je le pensai (c'est en effet "moins ludique"). Sinon vous avez une autre idee pour ca ^^ je suis tout ouie.
    Je conseille de définir un format texte simple... (CSV, par exemple)
    Une ligne par enregistrement
    Les champs séparés par des 'virgules' (souvent des ';' en fait...)...
    Pas de Wi-Fi à la maison : CPL

  9. #9
    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 Buendon
    Pour envoyer ta structure, tu as essayer d'envoyer la zone mémoire occupée par ta structure? Car il me semble que send et receive travaillent sur des (void *)...
    Donc du coup, du coté recepteur, avec un cast, ça doit marcher...
    Pas portable...
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Membre régulier

    Inscrit en
    Avril 2004
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 78
    Points : 74
    Points
    74
    Par défaut
    erf pas portable
    Ben c est pas grave je vais le faire en analysant le paquet de data recu, comme je faisais avant en java.

    [MAJ] j avais pas vu la reponse du csv ^^. Je fais essayer ca oui merci.

    Je devrais poster un nouveau message pour la question qui va venir mais bon je suis lancé ^^.
    Voila quelle est la difference entre le en mode connecte et en mode deconnecte pour une socket du domaine AF_UNIX (a part que le mode connecte envoie un stream et le mode non connecte envoie un datagramme) ??
    Ce que je veux dire par la c est si on utilise AF_UNIX ou AF_INET (avec comme adresse localhost), c'est (ou a peu pres) la meme chose non ? Ce n est donc pas la peine de garantir la transmission des donnees (donc utiliser TCP), amoins qu il y ait quelque chose de plus subtile.


    merci

  11. #11
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 38
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Pas portable...
    Autant pour moi.
    Et pour le format csv, bien joué, je trouve aussi que c'est une bonne solution .

Discussions similaires

  1. Arrêt d'un serveur multithread
    Par bambou dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 07/07/2010, 16h04
  2. conception serveur multithread
    Par nivose110 dans le forum Réseau
    Réponses: 12
    Dernier message: 17/07/2006, 16h43
  3. Réponses: 5
    Dernier message: 11/01/2006, 07h58
  4. [Question] serveur en tache de fond
    Par Nicaisse dans le forum Réseau
    Réponses: 11
    Dernier message: 14/08/2003, 10h47

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