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 :

[Socket C#] Méthode Send


Sujet :

C#

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 36
    Par défaut [Socket C#] Méthode Send
    Bonjour,

    Je suis entrain de développer un simple programme de chat en utilisant les sockets en C#. En fait il y a deux programmes, Serveur et Client

    Extrait du Serveur (Application Console) :
    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
     
    		static void Main(string[] args)
    		{
     
    			Socket socketServeur;
    			byte[] buffer = new byte[1024];
     
    			socketServeur = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
    			socketServeur.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"),5000));
    			socketServeur.Listen(10);
     
                Console.WriteLine("Le serveur a demarré");
    			while(true)
    			{
     
    				Socket socketClient = socketServeur.Accept();
    				int count = socketClient.Receive(buffer,0,1024,SocketFlags.None);
    				string s = Encoding.ASCII.GetString(buffer,0,count);
    				System.Console.WriteLine("\nle client a dit : "+s);
    				socketClient.Close();
    			}
    			socketServeur.Close();
     
    		}
    Les 2 fonctions les plus importantes du code du client :

    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
     
                             Socket socketClient;
    		int count;
    		public void connexion()
    		{
    			try
    			{
    				socketClient = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
    				socketClient.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReceiveTimeout,5000);
    				socketClient.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"),5000));
    			}
    			catch(Exception e)
    			{
    				textBox2.AppendText("\r\n"+e.Message);
    			}
    		}
     
    		public void envoi(string message)
    		{
    			try
    			{
    				if(socketClient.Connected)
    				{
    					count = socketClient.Send(Encoding.ASCII.GetBytes(message),0,message.Length,SocketFlags.None);
    					textBox1.AppendText("\r\nmessage envoye  ");  
    				}
    				else textBox1.Text = "vous n etes plus connectes";
     
    			}
    			catch(Exception e)
    			{
    				textBox2.Text = e.Message;
    			}
    		}
    Le probléme c'est que le client ne peut envoyer qu'un seul message au serveur.
    et merci bcp

  2. #2
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Par défaut
    La réponse est dans le code de ton serveur... Pourquoi fermes-tu la connexion avec le client ?


  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 36
    Par défaut
    Merci goldar, mais il n arrive jamais à cette ligne car il ne sort pas de la boucle while "while(true)"
    Aprés avoir envoyer le premier message que le serveur arrive à l'afficher, si je tente d'envoyer un autre message il me donne cette erreur "Une connexion établie a été abandonnée par un logiciel de votre ordinateur hôte"

  4. #4
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Par défaut
    Je recommence car tu n'as pas compris

    Quand tu fais ton accept, c'est qu'un client s'est connecté, donc tu récupères une Socket qui met en ralation le client et le serveur.
    Ensuite, ton serveur attend un message du client et quand c'est le cas, tu l'affiches... Puis tu fermes la communication ?!
    Ce qui veut dire que ton client qui pense que la connexion est toujours ouverte va vouloir renvoyer un message sauf que le serveur a fermé la connexion, d'où le message d'erreur que tu as mentionné.

    Ce que tu dois faire, c'est attendre la connexion d'un client en dehors de ta boucle while pour ensuite attendre les différents messages qui te seront envoyés.

    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
    Socket socketClient = socketServeur.Accept();
     
    try
    {
       while(true)
       {
          int count = socketClient.Receive(buffer,0,1024,SocketFlags.None);
          string s = Encoding.ASCII.GetString(buffer,0,count);
          System.Console.WriteLine("\nle client a dit : "+s);
          //socketClient.Close(); >> NON
       }
    }
    catch(Exception)
    {
       //Dans le cas où le client ferme la connexion
    }
    Seulement ton modèle a un défaut si tu veux que plusieurs clients se connectent au serveur... Il ne pourra accepter qu'un seul client ! Car ton serveur attend la connexion d'un client puis il boucle pour recevoir les messages.
    La solution est de multithreader ton serveur :
    Quand tu reçois la connexion d'un client, tu dois créer un Thread qui va recevoir la socket de communication avec le client et c'est là que tu vas faire ta boucle pour la lecture des messages.
    Au final, chaque client aura un thread qui lui sera dédié sur le serveur pour communiquer.

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 36
    Par défaut
    Merci bcp Goldar

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

Discussions similaires

  1. [SOCKET] comment rendre send() bloquant
    Par damien99 dans le forum Visual C++
    Réponses: 4
    Dernier message: 23/02/2007, 16h15
  2. Pb de socket : select() et send()
    Par olive_le_malin dans le forum Réseau
    Réponses: 16
    Dernier message: 11/06/2006, 11h42
  3. Réponses: 4
    Dernier message: 05/06/2005, 14h05
  4. [Wscript] probleme avec la méthode send
    Par machinTruc dans le forum Windows
    Réponses: 8
    Dernier message: 18/05/2005, 17h30
  5. [SOCKET C] deux send() pour un recv()
    Par trois_1 dans le forum Développement
    Réponses: 4
    Dernier message: 01/12/2003, 19h13

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