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 :

Utilisation des socket [Débutant]


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Utilisation des socket
    Bonjour,

    Dans le cadre d'un projet pour les cours, nous devons effectuer un petit jeu online, client serveur donc, avec le serveur sous linux en C et le client dans le langage et la plateforme qu'on veut. Dans le but de découvrir le C#, j'essaye de créer un client dans ce langage mais je suis confronte a un petit problème.

    Dans le but de simplifier l'utilisation des socket, je suis entrain de faire une classe pour encapsuler les sockets. Le client se connecte bien au serveur. Des la connexion, le serveur envoie "BIENVENUE\r\n" mais mon client reste bloque sur la lecture de la socket .
    Je vous fourni le code de ma classe qui n'est qu'une ébauche étant donne que j'ai commence le C# il y a 2 jours...
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net;
    using System.Net.Sockets;
     
    namespace Zappy.DLL
    {
        /// <summary>
        /// Classe gérant les socket simplement
        /// </summary>
        class Sock
        {
            private string error;
            private IPAddress ip;
            private Socket socket;
     
            /// <summary>
            /// Constructeur de la classe Sock.
            /// </summary>
            /// <param name="addr">Adresse Ip du serveur</param>
            /// <param name="port">Port d'écoute du serveur</param>
            public Sock(string addr, int port)
            {
                ip = IPAddress.Parse(addr);
                this.socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                try
                {
                    socket.Connect(new IPEndPoint(ip, port));
                }
                catch (SocketException E)
                {
                    this.error = E.Message;
                }
            }
     
            /// <summary>
            /// Fonction permettant de récupérer ce qu'il y a sur la socket
            /// </summary>
            /// <returns>retourne la valeur lue sur la socket</returns>
            public string Receive()
            {
                byte[] msg = new Byte[256];
                int nb = 0;
                string ret = "";
     
                try
                {
                    do
                    {
                        nb = this.socket.Receive(msg);
                        ret += Encoding.ASCII.GetString(msg, 0, nb);
                    }
                    while (nb > 0);
                }
                catch (Exception E)
                {
                    this.error = E.Message;
                }
                return (ret);
            }
     
            /* GETTERS / SETTERS */
     
            /// <summary>
            /// Retourne VRAI si une erreur est survenue
            /// </summary>
            public bool isError
            {
                get { return (this.error.Length > 0); }
            }
     
            /// <summary>
            /// Retourne la dernière erreur et la supprime
            /// </summary>
            public string Error
            {
                get
                {
                    string ret = this.error;
                    this.error = "";
                    return (this.error);
                }
            }
     
            /// <summary>
            /// Retourne VRAI si la socket est connectée
            /// </summary>
            public bool Connected
            {
                get { return (this.socket.Connected); }
            }
        }
    }
    Pourriez vous donc m'aider a comprendre pourquoi le receive bloque sur la lecture et plus precisement sur cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nb = this.socket.Receive(msg);
    Auriez vous egalement des sites, autre que ceux de developpez.com, qui expliquent et illustrent l'utilisation des sockets en C#.

    Merci d'avance,
    Remi

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 093
    Par défaut
    Les Sockets Windows sont par défaut en mode bloquante, tu dois les utiliser au sein d'un Thread

    Regarde la MSDN system.net.sockets et je pense que tu devrais lire aussi Blocking cela va t'expliquer le blocage du receive qui attend la réception de données !
    Cela te permettra au besoin de passer en mode Async
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci bien pour vos explications.

    Cordialement,
    Rémi.

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

Discussions similaires

  1. Utilisation des Socket
    Par Bull_ dans le forum C++
    Réponses: 4
    Dernier message: 11/03/2007, 15h48
  2. [c#] Utilisation des sockets
    Par zwoke dans le forum Windows Forms
    Réponses: 1
    Dernier message: 28/09/2006, 09h28
  3. [Socket][C++]Utilisation des sockets sur internet
    Par ChriGoLioNaDor dans le forum Développement
    Réponses: 8
    Dernier message: 13/01/2006, 21h38
  4. [MFC] Faible utilisation des sockets via les MFC ?
    Par Yellowmat dans le forum MFC
    Réponses: 1
    Dernier message: 25/08/2005, 17h15
  5. utilisation des sockets sous windows
    Par Tupac dans le forum Réseau
    Réponses: 2
    Dernier message: 21/12/2002, 18h24

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