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 :

[Sockets] Question sur Receive


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de Etanne
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 469
    Par défaut [Sockets] Question sur Receive
    Bonjour,

    Je suis actuellement entrain de réaliser un serveur en C# et j'utilise donc des Sockets.

    Dans mon programme, j'ai créé un Thread chargé de recevoir les données.

    Ce thread récupère les données envoyées par chaque client et traite le message.

    Son code :
    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
    foreach (Socket client in m_Clients.Values)
    {
        // Si on a reçu des données
        if (client.Available > 0)
        {
            byte [] buffer = new byte [client.Available];
     
            // Réception des données
            client.Receive(buffer, buffer.Length, SocketFlags.None);
     
            // Transformation bytes -> string
            string message = new System.Text.ASCIIEncoding().GetString(buffer);
     
            // Traitement
            Traitement(message);
        }
    }
    Mon problème est le suivant :

    Imaginons que tous les clients envoient toutes les secondes le message "bonjour".

    Si un traitement (fonction Traitement()) prend plus de 3 secondes pour un client, quand je vais faire le Receive pour le prochain client, je vais alors avoir le message "bonjourbonjourbonjour".

    Il y a t-il un moyen d'éviter cela, et par exemple imaginer un Receive qui indique que le client a envoyé 3 messages : "bonjour" "bonjour" et "bonjour" ?

    Merci !
    Flo

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    à priori non
    c'est pour ca que tout protocole de dialogue (http, ftp etc...) a des normes style caractère de fin de transmission
    par exemple utilise #

    car d'ailleurs, il n'est pas sur qu'une trame soit envoyé en une seule fois, elle peut très bien etre découpée par les couches tcp ip
    donc avec ta technique tu pourrais avoir bon puis jour et ne pas pouvoir interpreter la commande

    le principe est donc de concaténer tout ce que tu recois et qui si tu trouves dedans un caractère de fin, tu traite ce qu'il y a avant et tu tronques (puis tu regardes s'il y a encore un caractère de fin
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre éclairé
    Avatar de Etanne
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 469
    Par défaut
    Merci pour la réponse.

    Je dois donc normaliser mon protocole. Comme tu l'indiques, avec '#' par exemple : "#bonjour#"

    J'ai une autre question : comment me protéger d'une attaque DoS dans le programme ?

    Merci !

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    si ton appli est pas connue, ca sert à rien de s'en préoccuper (enfin si elle est pas publique)


    sinon y a doit y avoir des méthodes connues, perso à vu de nez j'aurais quelques idées genre :
    garder les connexions ouvertes
    si x ouverture de connexion d'une ip => attaque
    si x requete par seconde d'une connexion => attaque
    ordonner l'ordre des requetes, si requete pas bon ordre à partir d'une connexion => possibilité d'attaque

    enfin j'suis loin d'etre un pro en sécurité !!
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre éclairé
    Avatar de Etanne
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 469
    Par défaut
    Mon serveur sera public, et je crains par avance qu'un petit malin vienne faire une attaque.

    Je vais déjà protéger le code pour éviter qu'une IP se connecte plus que X fois au serveur.

    Maintenant, si des personnes avec des IP différentes bombardent le serveur..

    Merci !!

  6. #6
    Membre Expert Avatar de Tober
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 824
    Par défaut
    Je connais pas ton appli, mais deja tu peux limiter le temps entre de connexion d'un meme utilisateur car tu sais qu'un client ne va pas t'envoyer 1 requete toutes les x secondes...
    Tout depend de l'appli que tu developpe : si c'est un Messenger, tu peux pas limiter en temps ou tres court, si c'est un envoi de formulaire quotidient, ben tu peux deja elargir la limite
    Tu peux aussi limiter le nombre simultanne d'utilisateur ! Du genre, si nombre de client simultanne superieur a x, refuser connexion...
    Pense aussi a verifier ce qu'envoi un client, par exemple s'il doit t'envoyer des message genre texte et que tu recois des message de 10Mo, pause toi la question

    Voila vite fais quelques idees en plus

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Citation Envoyé par Etanne Voir le message
    Je dois donc normaliser mon protocole. Comme tu l'indiques, avec '#' par exemple : "#bonjour#"
    "Normaliser"? Il faut définir un protocole dans lequel les unités d'informations seront identifiables et grace auquel un client pourra ou pas expédier plusieurs messages à la suite sans que le serveur ne soit confus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    J'ai une autre question : comment me protéger d'une attaque DoS dans le programme ?
    Il me semblerait plus judicieux de traiter cela dans la couche réseau via des fonctions de pare-feux.
    Dans le cas d'un programme, le DoS peut se traduire par "combien de clients suis je capable de traiter en même temps pour que les temps de réponses soient raisonnables".

    Imaginons que tous les clients envoient toutes les secondes le message "bonjour".

    Si un traitement (fonction Traitement()) prend plus de 3 secondes pour un client, quand je vais faire le Receive pour le prochain client, je vais alors avoir le message "bonjourbonjourbonjour".

    Il y a t-il un moyen d'éviter cela, et par exemple imaginer un Receive qui indique que le client a envoyé 3 messages : "bonjour" "bonjour" et "bonjour" ?
    La question est de savoir comment "multiplexer" la réception des messages, leur traitement et les réponses en faisant en sorte que le design autorise un nombre "quelconque" de clients.

    Si "quelconque" est petit, on peut se laisser aller à assicier un thread par client. Si "quelconque" peut devenir "grand", il va falloir choisir entre une mécanique "event driven" ou un design dans lequel les différentes activités vont pouvoir être menée par un nombre minimal de threads.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre éprouvé Avatar de Onlava
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 92
    Par défaut
    Un thread producteur qui met dans une pile FIFO des messages
    My 2 cents : il faut pluôt une pile FILO afin de conserver l'ordre des paquets (vu qu'il est garanti par la couche TCP).

    ++

  9. #9
    Membre Expert Avatar de Tober
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 824
    Par défaut
    Tu pourrais ajouter un caractere de fin apres un message du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    message + "EndOfMessage"
    Bon, c'est pas l'idee du siecle

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

Discussions similaires

  1. [Vb.NET/Sockets] Question sur la taille du buffer
    Par Aspic dans le forum VB.NET
    Réponses: 4
    Dernier message: 05/01/2010, 07h03
  2. Question sur les socket AF_UNIX
    Par Mr_Chut dans le forum Réseau
    Réponses: 3
    Dernier message: 10/06/2006, 11h42
  3. Questions sur les socket
    Par lapras123 dans le forum Réseau
    Réponses: 13
    Dernier message: 09/06/2006, 16h34
  4. Encore une petite question sur les sockets...
    Par damien99 dans le forum MFC
    Réponses: 4
    Dernier message: 15/02/2006, 14h22
  5. [WinSock] Question sur les sockets (accept)
    Par Grey dans le forum MFC
    Réponses: 3
    Dernier message: 09/01/2006, 11h37

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