Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

NETACCESS 2.0 RC2 : LIBRAIRIE POUR APPLICATION CLIENTS/SERVEUR


Information sur la source

Catégorie :Réseaux & Internet Source .NET ( DotNet ) Classé sous : serveur, client, tcp, socket, réseau Niveau : Expert Date de création : 10/09/2007 Date de mise à jour : 04/03/2008 00:36:48 Vu / téléchargé: 9 456 / 461

Note :
10 / 10 - par 2 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (38)
Ajouter un commentaire et/ou une note


Description

NetAccess est un librairie fournissant une méthode d'implémentation d'application client/serveur utilisant le protocole TCP.
La librairie se charge elle même de la gestion de clients, des socket et de toutes les données relative à la communication.

L'intégration de ce système est extrêmement simple puisqu'il vous suffit de créer une classe dans votre application dérivant l'une des deux classe abstraite (NetAccess.Client.ClientManager ou NetAccess.Server.ServerManager).

Parmi les fonctionnalitées de cette version 2 :
-> Possibilité de compression des transmission en utilisant l'algorithme GZip
-> Gestion de la capacité du serveur (en nombre de client)
-> possibilité à l'application de refuser la connexion d'un client
-> vérification de la compatibilité du client et du serveur
-> Ping

Nouveauté de la béta 2
-> Log avec différent niveau de rapport (les log sont désormais basé sur la librairie externe log4net disponible ici : http://logging.apache.org/log4net/)
-> Cryptage des transactions à la demande utilisant du RSA combiné avec Rijndael
-> Meilleur gestion des clients (expulsion avec message,...)
-> Possibilité d'indiquer un message envoyé au client automatique lors de l'arrêt du serveur.
-> Réécriture du système d'envoi/réception des messages pour une montée en charge bien meilleur (correction des mauvaises transmissions lors de la transmission de beaucoup de paquet en peu de temps | prise en charge des données dépassant la taille du buffer)

Des exemples d'implémentation seront fournit par la suite.

=====================================

Je viens de mettre à jour la source vers une nouvelle version qui corrige quelques éléments. Voici le changelog :

 Ajout de la configuration « string ServerConfiguration.StringServerPrivateKey » pour le serveur.
 Ajout de la configuration « string ClientConfiguration.StringServerPublicKey « pour le client.
 Ajout de la méthode « string EncryptionManager.ConvertKeyToString(byte[] key) ».
 Ajout de la méthode « byte[] EcryptionManager.ConvertKeyFromString(string key) ».
 Correction du bug #001.
 Correction du bug #002.
 Correction du bug #003.
 Correction du bug #004.
 Correction du bug #005.
 Ajout de l'évènement StateChanged sur le serveur lancé à chaque changement d'état du serveur.
 Correction du bug #006.
 Correction du bug #007 (l'utilisation de "return" dans la boucle de traitement empêchait l'analyse de tout les packets).
&#61672; Passage du tableau de client de HybridDictionnary en Dictionnary<int, Client> afin d'améliorer les performances.
&#61672; Passage de l'id client en type Int32 afin d'améliorer les performances.
&#61672; Ajout de la méthode SendToRange(ICollection<int> listClient, NetworkPacket packet, bool crypt) permettant d'envoyer un packet à une liste de client.
&#61672; Le méthode ClientManager.Close() à été renommée en ClientManager.Disconnect().
&#61672; Correction du bug #008.
&#61672; Ajout de l'évènement StateChanged sur le client lancé à chaque changement d'état du client.
&#61672; ServerManager.Start() transmet maintenant les exceptions lancé durant le démarage à l'application principale.
&#61672; Ajout d'une surcharge sur le constructeur de NetworkPakcket : new NetworkPacket(object type, params object[] data)
&#61672; Ajout de ServerManager.GetIpEndPointFromId(int clientId)
&#61672; Ajout de ServerManager.GetClientIdFromIP(IPAddress ip)

=====================================
A propos de la mise à jour du 4 mars 2008.
C'est ici la version avant publication des sources. Aucune modification d'interface ou de fonctionnalité ne sera fait d'ici la version release.

La dll log4net est fournit dans les sources (log4net.dll.rename à renommé en log4net.dll).
=====================================
/!\ ATTENTION /!\
Cette source utilise le framework 3.5; La solution quand à elle provient de Visual Studio 2008 dont la version C# Express est disponible ici : http://www.microsoft.com/express/vcsharp/Default.aspx
 

Conclusion

La version des sources est actuellement une version RC1.
Vous pouvez retrouver la page du projet sur : http://www.codeplex.com/NetAccess (attention actuellement seule la version 1.0 est actuellement publiée sur codeplex)

=====================================
-= BUG =-

• #001 : Un cas non traité lors de l’écriture du packet provoquait une exception.
• #002 : Une exception peut être levée en cas de déconnexion du client juste après une réception. Cette erreur était du à une mauvaise condition sur un test (sans test préalable de nullité).
• #003 : Une exception pouvait être lancée lors de la fermeture des handle sécurisé si ceux-ci était encore en écoute.
• #004 : Une exception peu indicative apparaissait lorsque qu'un hôte inexistant ou introuvable était passé en paramètre IP du client.
• #005 : Une erreur se produisait lorsque l’on tentait de fermer le client sans s’être connecté à un serveur.
• #006 : Une erreur pouvait se produire au niveau de l'écoute des clients entrants lorsque le serveur était disposé.
• #007 : Lors de la réception de plusieurs packet dans un délai très court, seul le premier packet était traité (alors que les suivants était correctement reçu)
• #008 : Lors de la déconnection, l'autoresetevent du ping était fermer et n'était pas réouvert en cas de reconnexion



=====================================
-= FAQ =-

(si vous avez d'autres question n'hésitez pas à les posez en commentaires)

-> pourquoi avoir fait une nouvelle source?
La librairie étant complètement réécrite et réorganisé, j'ai choisi de la présenter comme une nouvelle source. De plus la compatibilité avec la version n'a pu être assurée.

-> Pourquoi poster une source non terminée?
J'ai posté cette source avec deux objectif : la faire partager pour permettre au personne le souhaitant d'étudier le fonctionnement des socket mais aussi afin d'obtenir un retour sur le fonctionnement, la stabilité et les éventuel problèmes rencontrés lors de l'implémentation (en vue de la création d'une doc).

-> Faut-il être expert (niveau de la source) pour utiliser la librairie?
Non pas du tout. La librairie à été conçu avec pour objectif de fournir une implémentation la plus simple possible. Le niveau Expert de la librairie correspond plutôt au niveau de son code source interne intégrant des socket, du multi-thread, des technique particulière de lancement d'évènement, de l'abstraction, du cryptage,...

-> Comment activer le cryptage?
Pour activer le cryptage vous devez dans un premier temps générer un couple clef public/privé pour le serveur (Une méthode est prévu à cette effet : NetAccess.EncryptionManager.GenerateKeyPair(out byte[] publicKey, out byte[] privateKey) ). En suite voud devez paramétrer votre serveur Server en activant UseEncryption et en renseignant le champs ServerPrivateKey. Enfin vous devez paramétrer votre client en activant UseEncryption et en renseignant ServerPublicKey. Ensuite pour faire un envoi crypter utilisé la méthode send avec le paramètre "crypt" à true.

=====================================
Information Complémentaire : s'agissant d'une version béta je vous serait reconnaissant de me faire remonter toutes erreurs, exceptions, soucis, avis,... afin de pouvoir obtenir une version final la plus stable possible.

=====================================
Evolution future : pour la version 2.1 j'intégrerais la possibilité d'utiliser UDP pour certaine transaction (ainsi l'utilisation de NetAccess dans les jeux vidéo nécessitant la transmission de certain type de message de façon très fréquente : refresh de position; sera amélioré). Bien entendu cette amélioration ne se limite pas au seul domaine du jeu vidéo puisque d'autre type d'application pourront y trouver leur compte.
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

10 septembre 2007 19:47:27 :
orthographe
10 septembre 2007 20:56:32 :
description
16 décembre 2007 15:13:09 :
Suppression de key.pfx dans le zip.
15 janvier 2008 13:56:08 :
Publication de NetAccess 2 béta 2. Pour plus d'information sur les modifications reportez vous à la description de la source.
15 janvier 2008 14:58:26 :
ajout de l'avertissement sur vs2008
20 janvier 2008 11:12:03 :
modification des mots-clef
07 février 2008 09:47:04 :
mise à jour de la béta avec correction de quelques bugs
07 février 2008 09:51:19 :
passage des texte en version RC1
04 mars 2008 00:36:49 :
version RC2

Commentaires et avis

signaler à un administrateur
Commentaire de wizad le 13/09/2007 18:19:42

Bah alors vous restez sans voix?? ^^

signaler à un administrateur
Commentaire de foubetc le 17/09/2007 09:08:30

Salut Wizad !
Merci pour ton beau boulot.
Je viens juste de télécharger celui-ci, mais j'en profite quand même pour te dire que la première mouture promettais et que je suis sur que celle ci me plaira également.

signaler à un administrateur
Commentaire de wizad le 17/09/2007 09:32:27

Merci pour tes encouragement. Concernant celle-ci tu pourra constater un importante réorganisation ainsi que de nouvelle fonctionnalités (notamment la possibilité de gérer le nombre de place sur le serveur). Et je suis entrain de préparer un exemple d'utilisation qui devrait plaire.

signaler à un administrateur
Commentaire de foubetc le 17/09/2007 11:12:56

J'attend avec impatience ! :)

signaler à un administrateur
Commentaire de Mahrak le 20/09/2007 00:44:33

J'avais essayer de faire une interface réseau avant de découvrir NetAccess, mais j'ai galéré pendant un bon moment sans grand succès. Ta librairie m'a grandement facilité le travail. Je l'apprécie beaucoup pour sa simplicité et sa facilité d'utilisation. Je l'avais aussi retouchée et dérivée pour pouvoir faire un controle du nombre d'utilisateurs qui se connecte, mais je vois que tu as implémenté ca bien mieux que moi sur cette seconde version. Cette version semble beaucoup plus complète, j'attend avec impatience la version final.

Merci pour le travail et bon courage pour la finalisation.

signaler à un administrateur
Commentaire de wizad le 20/09/2007 07:59:49

Merci pour ses encouragements. Concernant la finalisation n'hésitez surtout pas à me faire par de tous les bugs rencontrés (y en a quelques uns ^^).

Sinon pour toute les idées et suggestions de nouvelles fonctionnalitées pour la version prochaine je reste bien entendu à l'écoute.

signaler à un administrateur
Commentaire de thediome le 25/10/2007 20:53:49

Peut-on avoir le mot de pass du key?

signaler à un administrateur
Commentaire de wizad le 26/10/2007 00:01:26

J'ai pas compris la question

signaler à un administrateur
Commentaire de maneli le 16/12/2007 11:46:45

Bonjour, lors de lancement du projet il faut entrer le mot de passe afin de pouvoir importer key.pfx.
Ne connaisant pas le  mot de passe, il est impossible de lancer le projet.

cdt

signaler à un administrateur
Commentaire de wizad le 16/12/2007 11:59:44

Oups exact toutes mes excuses.

Je re upload le zip sans la clef ce soir. (ou dans la journée si j'ai un peu de temps).

signaler à un administrateur
Commentaire de wizad le 16/12/2007 15:18:53

C'est corrigé. Plus de soucis de clef.

Concernant l'évolution, rendez-vous début janvier (au retour des vacances) pour le code sources de la béta 2 (qui devrait cette fois intégrer l'intégralité des nouveauté prévu de la v2 v).

Pour vous donnez quelques exemples d'applications j'ai pu tester la béta 2 (en cours de dev) sur des applis varié : transmission de webcam, transfert de fichier,... . Une des applications que je n'ai par contre pas pu tester est la transmssion de voix : je n'ai à l'heure actuellement pas trouvé de librairie de capture audio.


Pour le moment je mise sur un sortie finale de la v2 pour le 14 février (date de mon anniversaire pour la petite histoire ;) ).

Bon réseau à tous!

signaler à un administrateur
Commentaire de maneli le 18/12/2007 02:20:13

Merci pour la clée.

Je n'ai pas pu trouver d'exemple d'implémentation conernant le traitement des logs. En effet comment fait on afin de souscrire une classe au Log afin de récuperer le flux et le traiter le évenement
public event EventHandler<LogAddedEventArgs> LogAdded;

Bien cordialement.

signaler à un administrateur
Commentaire de wizad le 18/12/2007 07:33:16

Il faut tout simplement s'abonner à l'évenement :

Lof.Instance.LogAdded += ...

signaler à un administrateur
Commentaire de maneli le 18/12/2007 10:51:52

Merci.

En fait il y a un exemple dans la classe client manager.
Exemple que je n'avais pas vu. Le compilateur m'envoyait une erreur sur le typage (alors que j'avais bien indiqué
NetAcess.Log.Instance.LogAdded += new EventHandler<LogAddedEventArgs>(WriteLogEntry);).

il fallait rajouter Log.LogAddedEventArgs

Encore merci

signaler à un administrateur
Commentaire de maneli le 20/12/2007 03:25:12

Bonjour.

Je pense que certains vont etre confrontés au meme problème que je rencontre. Je cherhe à afficher les message de log dans un richTexbox. Les Form ne sont pas thread safe et il faut donc faire la manip suivante:
1) déclarer les délégates
internal delegate void UpdateDelegateHandler(String message);
private UpdateDelegateHandler UpdateDelegate

2) s'aboner à l'évènement log puis déclarer la methode à executer

private void init()
{
UpdateDelegate = new UpdateDelegateHandler(safeWrite);  
Log.Instance.LogAdded += new EventHandler<BeanLog.Log.LogAddedEventArgs>(OnNewLog);
}

private void OnNewLog(object sender, BeanLog.Log.LogAddedEventArgs e)
        {
            String message = e.text + "\r\n";
            this.safeWrite(message);          
        }
3) déclarer uneméthode d'écriture sécurisée
private void safewrite(String Message)
  {
   this.texbox1.append(message);
  }
4) j'instancie la Form de la manière suivante

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Form MainFrom = new FormMain();
Application.DoEvents();            
Application.Run(MainFrom);
            

Problème: la fenetre se lance et je vois gace au débogeur que les évènements n'alimentent pas l'écran. En revanche lorsque je ferme la fenetre (bouton fermer) les évenments commencent à affluer.

Est-ce que quelqu'un connaitrait des remèdes? faut il instancier Form de manière spécifique? Faut il trainter les évènements autrement?

signaler à un administrateur
Commentaire de wizad le 20/12/2007 08:27:42

Pour l'instanciation via ton exemple tu peux directement faire : Application.Run(new FormMain);

Concernant le thread-safe voici généralement les 3 élément que j'utilise :

private void InvokeAppendLog(string message)
{
    this.Invoke(new AppendLogHandler(AppendLog), new object[] { message });
}
private delegate void AppendLogHandler(string message);
private void AppendLog(string message)
{
   this.textbox1.append(message);
}

Après il suffit d'appeler this.InvokeAppendLog("mon log");

signaler à un administrateur
Commentaire de maneli le 20/12/2007 11:20:00

Bonjour.

Merci beaucoup pour le feedback. Je l'ai implémenté et le résultat est le meme. Le code marche parfaitement bien une fois que la fenetre est fermée (le thread form continue mais les widjets associés sont détruits).Je vais implémenter le code dans un usercontrol et voir ce que ça donne.

cdt.

signaler à un administrateur
Commentaire de maneli le 20/12/2007 13:01:40

Bonjour.

voici le code en entier, les évènements n'arrives n'atteignent pas la classe une fois qu'on lance application.run(new fom1())

using System;
using System.Collections.Generic;
using System.Text;

namespace BeanGUI
{
    public class Form_Server : System.Windows.Forms.Form
    {
        #region compiler added

        private System.Windows.Forms.RichTextBox RichTxtBx_Log;    
        private void InitializeComponent()
        {
            this.RichTxtBx_Log = new System.Windows.Forms.RichTextBox();
            this.SuspendLayout();
            //
            // RichTxtBx_Log
            //
            this.RichTxtBx_Log.Location = new System.Drawing.Point(45, 83);
            this.RichTxtBx_Log.Name = "RichTxtBx_Log";
            this.RichTxtBx_Log.Size = new System.Drawing.Size(273, 177);
            this.RichTxtBx_Log.TabIndex = 0;
            this.RichTxtBx_Log.Text = "";
            //
            // Form_Server
            //
            this.ClientSize = new System.Drawing.Size(368, 288);
            this.Controls.Add(this.RichTxtBx_Log);
            this.Name = "Form_Server";
            this.ResumeLayout(false);

        }
        #endregion

        public Form_Server()
        {
            InitializeComponent();
            this.Subscribe();
        }
        #region safe write hadlers
        public void Subscribe()
        {            
            BeanLog.Log.Instance.LogAdded += new EventHandler<BeanLog.Log.LogAddedEventArgs>(OnNewLog);
        }

        public void UnSubscribe()
        {            
            BeanLog.Log.Instance.LogAdded -= new EventHandler<BeanLog.Log.LogAddedEventArgs>(OnNewLog);            
        }

        private void OnNewLog(object sender, BeanLog.Log.LogAddedEventArgs e)
        {
            String message = e.text + "\r\n";
            InvokeAppendLog(message);
        }


        private void InvokeAppendLog(string message)
        {
            this.Invoke(new AppendLogHandler(AppendLog), new object[] { message });
        }

        private delegate void AppendLogHandler(string message);
        private void AppendLog(string message)
        {            
            this.RichTxtBx_Log.AppendText(message);
        }
        #endregion
    }
}

signaler à un administrateur
Commentaire de maneli le 20/12/2007 21:04:35

Bonsoir.

J'ai résolu le problème.
Il était du à un process qui ne rendait pas la main.
Celà dit il est possible de se passer de nested. le code qui va suivre est thread Safe.

#region Singleton
        static Log instance = new Log();
        // Singleton Manager
        //static Log instance = new Log();

         static Log()
        {
        }

        Log()
        {
          
        }



        public static Log Instance
        {
            get
            {
                //return Nested.instance;
                return instance;
            }
        }
#endregion

signaler à un administrateur
Commentaire de wizad le 15/01/2008 13:59:50

Bonjour à tous.
Je viens de publier la nouvelle version de NetAccess (la béta 2) qui implémente désormais toutes les fonctionnalités prévu pour la v2.

Pour les nouveautées principale c'est en dessous :

-> Log avec différent niveau de rapport (les log sont désormais basé sur la librairie externe log4net disponible ici : http://logging.apache.org/log4net/)
-> Cryptage des transactions à la demande utilisant du RSA combiné avec Rijndael
-> Meilleur gestion des clients (expulsion avec message,...)
-> Possibilité d'indiquer un message envoyé au client automatique lors de l'arrêt du serveur.
-> Réécriture du système d'envoi/reception des messages pour une montée en charge bien meilleur (correction des mauvaises transmissions lors de la transmission de beaucoup de paquet en peu de temps | prise en charge des données dépassant la taille du buffer)

signaler à un administrateur
Commentaire de BaFM le 15/01/2008 16:57:48

Bonjour,
Il aurait été plus intéressant d'utiliser le SslStream afin de crypter le flux. Les apports sont les suivants : échange automatique de clés publiques, configuration du type de cryptage désiré et meilleurs performances. (et aussi possibilité de faire un client pour un serveur déjà existant en crypté en SSL)
Le cryptage RSA est bien, mais il n'est pas fait pour crypter sur la durée, il nécessite de la charge et les pacquets font une taille fixe par blocks. L'utilisation après échange utilisant RSA d'une clé privé pour un algorithme symétrique qui sont généralements plus rapides (AES) reduit la charge et garde le niveau de protection.
Cordialement.

signaler à un administrateur
Commentaire de wizad le 15/01/2008 17:12:39

Bonjour,
Si vous aviez pris le temps de consultez sérieusement la source vous auriez pu noter le protocole de cryptage. Celui-çi utilise le rsa en combinaison de l'AES (implémentation Rijndael) afin de palier au problème de lenteur.
Il s'agit d'ailleur d'un protocole fortement inspiré de l'implémentation même de SSL.

Concernant l'utilisation de SslStream plusieurs points font que je ne l'ai pas utiliser :
-> Volonté de maitrise du code (utilisation direct des sockets)
-> Intégration au travers de l'architecture existante
-> echange automatique des clefs publiques : celà peut paraître surprenant mais l'attribution "en dur" de la clef public du serveur et le protocole interne que j'utilise mais permettre de contrer une attaque de type "Man in the Middle".

Enfin pour répondre à votre remarque sur le channel programmation, mon but n'était pas de faire de la pub pour de la pub. Mais de faire connaitre cette lib pour rendre service (vu le nombre de message sur les notions clients/serveur qui peuplent le forum)

Cordialement, en espérant avoir répondu pleinement à vos question

PS : bien entendu je reste ouvert à tout débat constructif sur le sujet et le ton peut être un peu sec que j'emploi est uniquement du à ma volonté de précision. ;)

signaler à un administrateur
Commentaire de wizad le 15/01/2008 17:20:29

@Bafm : je viens de me rendre compte que j'ai mal lu votre message concernant l'utilisation de la clef symmétrique.

J'était au départ partit sur la solution que vous proposez mais l'avais écarté pour un soucis de "sécurité" (qui en fait n'est que partiellement résolu avec le protocole que j'utilise).

Je vais donc refaire quelque recherche (et test de performance) à ce sujet.

Néammoins pour la partie performance, l'utilisation du crypte à "la demande" (uniquement pour la transmission des données sensible) permet d'en limiter l'impact.

signaler à un administrateur
Commentaire de BaFM le 15/01/2008 17:42:06

Hum, d'accord. En effet j'ai pas totalement regardé. Sinon ca parait bien.
Pour pousser un peu sur l'histoire de man in the middle, tu peux alors faire en sorte de pouvoir utiliser des certificats, la validation des certificats par l'utilisateur, digest... Parce qu'il faut bien à un moment échanger les clés.
Pour éviter ces attaques, il est possible d'utiliser Diffie-Hellman, de s'envoyer des nonces et de signer les pacquets reçus afin de comparaison, en utilisant des Nonce et certaines autres parties du message.
Afin, il y a plein de manière d'éviter cette attaque tout en pouvant échanger des clés secrètement et de manière sécurisée. Le man in the middle n'étant pas au départ censé connaître le protocol.

Bonne continuation.

NB: La seul évocation de Rijndael n'indique pas l'utilisation d'AES, c'est le 'R' de RSA aussi je crois.
PS: Et le canal irc, ca n'a pas beaucoup d'impact, il y a tellement de monde dessus...

signaler à un administrateur
Commentaire de wizad le 15/01/2008 17:51:14

Pour te détailler (et pour en parler) voici le protocole actuellement utilisé :

La clef privé du serveur est codé en "dur" (par l'utilisateur de la lib) dans celui-ci. La clef public du serveur est codé en "dur" (par l'utilisateur de la lib) dans le client.
Au moment de la connexion, le client crée un couple de clef aléatoirement. Il envoi sa clef public au serveur (en prenant soit de crypter le message avec la clef publique du serveur).

Pour les échange, un clef privé est généré, on crypte le contenu avec (Rijndael) et on la transmet de façon crypte (RSA).

Concernant ta suggestion d'utilisation de certificat ça peut être une bonne idée mais faut que je documente la dessus.

NB : pour rijndael il s'agit du standart d'implémentation d'AES (http://fr.wikipedia.org/wiki/Rijndael)

PS : pas de soucis pour le canal IRC je tenais juste à expliquer ma démarche ;)

signaler à un administrateur
Commentaire de sixpah le 24/01/2008 21:37:51

Wizad, aurais-tu une application très simple pour illustrer la librairie ?
Car j'essaie de la mettre en route mais sincèrement j'y arrive pas ;)
Tu aurais une appli exemple ? Un sample .. ?

Merci beaucoup en tout cas !

signaler à un administrateur
Commentaire de wizad le 24/01/2008 21:48:33

Voir la réponse que je t'ai fournit par MP.

Pour les autres un démo devrait rapidement être disponible (je vais essayer de faire ça pour se week end).

Je précise aussi que j'ai déjà répertorié quelques erreurs et que ceux-ci sont corrigé. J'uploaderais la correction demain.

signaler à un administrateur
Commentaire de oximoron le 29/02/2008 18:41:52

Super boulot, ca à l'air vraiment bien, j'ai pas essayé de façon très poussé mais le peu que j'ai essayé marche (c'est déjà pas mal ;).  Il manque juste un petit exemple, ca n'est pas toujours évident d'implémenter des classes toutes faites sans un exemple ou une doc. Par contre cette source sera sous quelle licence ? (une bsd ou lgpl serait le top ;) )

signaler à un administrateur
Commentaire de oximoron le 01/03/2008 23:16:34

Pour l'avoir essayé un peu plus en profondeur, elle marche vraiment bien. Il y a quelques try catch à rajouter pour déconnecter le client/sereur proprement au lieu de faire planter l'appli mais c'est du bon boulot. Pour ceux que ca intéresse voici une petite fonction à rajouter dans le ServerManager.cs qui permet de trouver l'id d'un client à partir de son adresse ip (c'est peut être pas comme ca que ca à été prévu ;) mais sans doc/exemple c'est un peu de la devinette parfois ;) )

protected string Ip2IdClient(string asIp)
{
   foreach (Client loClient in m_clients)
      if(loClient.EndPoint.Address.ToString() == asIp)
          return loClient.Id;
   return asIp;
}

signaler à un administrateur
Commentaire de wizad le 02/03/2008 16:39:54

Merci de ton retour.

Concernant la licence ce sera vraisemblablement du LGPL.

Pour l'exemple je suis entrain de finaliser celui qui sera fournit avec le SDK (un classic chat).

Pour les try/catch j'en est corrigé et ce sera mis dans la version finale.

Concernant ta suggestion je vais voir à l'intégrer pour la version finale (je n'avais pas pensé à cette possibilité).

signaler à un administrateur
Commentaire de BaFM le 02/03/2008 17:16:11

Il faut faire attention avec cette sugestion, car dans certains cas (NAT principalement) plusieurs clients pourraient posséder là même IP tel que vu par le serveur, il faut donc un moyen de retourner toutes les clients possibles, ou de pouvoir identifier avec cune information supplémentaire.

Je rajouterais qu'il serait plus judicieux de transformer le paramètre asIp en IPAddress au lieu de faire une comparaison de chaîne. Ca permet de gagner du temps sur la comparaison. De plus, il est possible de mettre en place un dictionnaire pour effectuer la recherche plus rapidement.

signaler à un administrateur
Commentaire de oximoron le 03/03/2008 07:09:00

j'avais pas fait gaffe mais il y a une petite erreur dans le code que j'ai donné ...
Il faut remplacer le foreach (Client loClient in m_clients)
par foreach (Client loClient in m_clients.Values)
@BAFM:oui on peut l'optimiser, moi j'ai fait cette fonction car dans mon cas ca marche bien dans un petit reseau local avec une dizaine de poste configuré en dhcp. Sinon au pire il faut passer l'id dans chaque envoi au serveur... mais attendons l'exemple ;

signaler à un administrateur
Commentaire de wizad le 03/03/2008 08:18:10

En fait je suis entrain de refaire une méthode équivalente en utilisant LinqToObject.

Sinon juste pour vous dire que le stockage des client est passé de HashTable en Dictionary<int, Client>. De plus comme vous pouvez le devinez sur le dictionary, les id client sont repassé en int (afin d'éviter des cast en string inutile).

Pour la suite du changelog je vous laisse patienter jusque cet après midi.

signaler à un administrateur
Commentaire de oximoron le 03/03/2008 19:55:35

c'est super sympa linq mais ca implique le framework 3 (ou 3.5) ... c'est un peu dommage pour un libraire, surtout que c'est pas forcement obligatoire si c'est juste pour une methode. Sinon pour l'avoir mis en production aujourd'hui, cette source (que j'ai modifié (pour mes besoins spé + les try catch qui manquait) marche bien.

signaler à un administrateur
Commentaire de wizad le 03/03/2008 19:59:57

@oximoron : c'est exact. Je vais regarder ce que je peux faire.

Je te contact par MP pour en savoir plus sur les modifications que tu as faites (éventuellement certaine pourrait être intégrable)

signaler à un administrateur
Commentaire de oximoron le 03/03/2008 20:40:09 10/10

j'ai oublié la note : 7/10 sans exemple mais vu qu'il y en aura un bientôt un c'est 10/10

signaler à un administrateur
Commentaire de wizad le 04/03/2008 00:39:16

Je viens de mettre à jour les sources avec la toute dernière version (rc2)

Bon test.

Je publie dans la foulé la première démo

signaler à un administrateur
Commentaire de wizad le 04/03/2008 00:58:33

Voici le lien vers la démo :

http://www.csharpfr.com/codes/DEMO-NETACCESS-NETMESSENGER_45942.aspx