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

C# Discussion :

[C#] Architecture de serveur


Sujet :

C#

  1. #1
    Membre chevronné
    Avatar de emixam16
    Homme Profil pro
    Chercheur en sécurité
    Inscrit en
    Juin 2013
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Chercheur en sécurité

    Informations forums :
    Inscription : Juin 2013
    Messages : 335
    Points : 1 837
    Points
    1 837
    Par défaut [C#] Architecture de serveur
    Bonjour,

    Je programme actuellement un serveur. Puisque il est prévu pour accueillir un assez grand nombre de client, il n'est pas envisageable de créer un thread par client.

    Je suis donc parti sur une architecture "custom" où j'ai plusieurs thread qui servent à gérer la (dé)connection/L'envoi/Reception et le traitement de données. Voici mes variables (c'est surement pas l'organisation parfaite mais c'est un premier jet que j'améliorerais au fil du temps).

    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
    #region Variables
    #region Threads
    //Thread to handle connections
    static Thread ConnectThread;
    //Threads To recieve messages
    static Thread ReadThread, WriteThread;
    //Thread to handle Message
    static Thread HandleThread;
    // Thread To disconnect clients when it's needed
    static Thread DisconnectThread;
    #endregion
    #region Data
    public static List<Client> Clients = new List<Client>();
    static Queue<PacketStream> DataToSend = new Queue<PacketStream>();
    static Queue<Packet> DataToHandle = new Queue<Packet>();
     
    public static bool IsClientsAvailable = true;
    static bool IsDataToSendAvailable = true;
    static bool IsDataToHandleAvailable = true;
    #endregion
    #endregion
    Les fonctions liées à ces threads sont donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public static void Initialize();
    public static void Connect();
    private static void Read();
    private static void Write();
    private static void Handle();

    Mon problème est le suivant : Quand un client veux se connecter au serveur

    Il se fait Accepter par le serveur dans Connect par ConnectThread;

    Il envoie un paquet de connexion qui sera lu par read.

    Ce paquet doit être traité par handle. Un paquet de réponse est crée. Cependant pour ajouter le client, et envoyer le paquet de réponse, je dois avoir accès au NetworkStream lié à mon client. Problème ? Je n'y ais eu accès que dans mon Connect() avec tcpListener.AcceptTcpClient().GetStream(). Mais a ce moment la le client ne m'a envoyé aucun paquet, donc je n'ai (à priori) aucun moyen de l'identifier. Or, je ne peux pas me permettre de faire une fonction bloquante qui attende le paquet de connexion, puisque tout les clients qui se connectent sont sur la même file d'attente. Du coup, une fois dans mon handle(), je ne sais pas du tout comment récupérer cette donnée.

    Quelqu'un aurait il des idées pour récupérer des données ou contourner ce problème? Mon architecture tient elle plus où moins la route ?

    Si des points ne sont pas très clairs, posez moi des questions, j'expliquerais plus en détail.

    Merci d'avance pour votre aide

  2. #2
    Membre averti Avatar de pascalCH
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Juillet 2006
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 187
    Points : 369
    Points
    369
    Par défaut
    Bonjour,

    avec TcpListener.AcceptTcpClientAsync, ça peut peut etre solutionner le problème.

    Autre remarque : pourquoi toutes ces méthodes statiques ? je ne connais pas le reste du code mais ça me semble étrange dans un contexte multi-thread

Discussions similaires

  1. [Architecture SQL Serveur] Clause UNIQUE.
    Par ylarvor dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 04/04/2008, 16h28
  2. Application avec architecture client/serveur
    Par loreleï85 dans le forum Développement
    Réponses: 4
    Dernier message: 09/05/2007, 08h16
  3. MySQL en architecture client/serveur
    Par KinF dans le forum Requêtes
    Réponses: 1
    Dernier message: 07/09/2005, 22h10
  4. [Indy] Architecture Client/Serveur
    Par yongblood dans le forum Web & réseau
    Réponses: 9
    Dernier message: 22/08/2005, 01h18

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