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 client serveur


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    617
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 617
    Par défaut Socket client serveur
    Bonsoir,
    j'ai besoin d'un serveur qui reçoit de manière aléatoire des messages d'un client.
    J'ai fait ce serveur mais la manière dont il recoit les messages du client est complètement aléatoire, temps en temps il reçoit le message mais la plupart du temps non. Il y a peut-être pas grand chose mais je ne comprend pas ce qu'il a de faux dans mon 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    private void button2_Click(object sender, EventArgs e)
    {
    	IPAddress ip = IPAddress.Parse("127.0.0.1");
    	SocketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    	SocketServer.Bind(new IPEndPoint(ip, 2660));
    	SocketServer.Listen(1);
    	SocketServer.BeginAccept(new AsyncCallback(SocketAccepted), SocketServer);
    }
     
    private void SocketAccepted(IAsyncResult asyncResult)
    {
    	SocketClient = SocketServer.EndAccept(asyncResult);
    	Buffer = new byte[SocketClient.Available];
     
    	SocketClient.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, new AsyncCallback(DataReceived), SocketClient);
    }
     
    public void DataReceived(IAsyncResult asyncResult)
    {
    	string s;
     
    	SocketClient.EndReceive(asyncResult);
    	s = System.Text.Encoding.ASCII.GetString(Buffer);
    	SetText(s);
    	SocketClient.Shutdown(SocketShutdown.Both);
    	SocketClient.Close();
    	SocketServer.BeginAccept(new AsyncCallback(SocketAccepted), SocketServer);
    	//SocketServer.Close();
    }
    Si une bonne âme peut me donner des indications, ce serait avec le plus grand plaisir.
    Bonne soirée à tous !!

  2. #2
    Membre émérite Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    617
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 617
    Par défaut
    J'ai trouvé le bug...
    En fait, il faut attendre que le ClientSocket aie des données à fournir. La propriété Available ne se met pas à jour immédiatement. Pour avoir un buffer de la bonne longueur en l'initialisant avec ClientSocket.Available il faut être sûr que cette propriété soit mise à jour. Il faut toutefois prévoir un timeout au cas ou le client enverrais un buffer vide.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    private void SocketAccepted(IAsyncResult asyncResult)
    {
    	DateTime now;
     
    	SocketClient = SocketServer.EndAccept(asyncResult);
    	now = DateTime.Now;
    	while ((SocketClient.Available == 0) && (DateTime.Now < now.AddSeconds(10)))
    	{
    	}
    	Buffer = new byte[SocketClient.Available];			
    	SocketClient.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, new AsyncCallback(DataReceived), SocketClient);
    }
    Et comme ça, ça fonctionne impeccablement.
    De plus, je trouve plus propre d'empoyer les AsyncCallback que de faire une boucle infinie dans laquelle on accepte les clients (comme indiqué dans la plupart des tutos (sans vouloir vexer personne))

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

Discussions similaires

  1. sockets client serveur
    Par Taoufik109 dans le forum Développement
    Réponses: 2
    Dernier message: 03/01/2008, 18h03
  2. [C] Probleme avec socket client-serveur TCP
    Par LinuxUser dans le forum Réseau
    Réponses: 33
    Dernier message: 15/05/2007, 22h26
  3. [socket] client/serveur multi-thred
    Par iag_1980 dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 03/03/2007, 15h38
  4. socket client serveur
    Par idino dans le forum Réseau
    Réponses: 3
    Dernier message: 29/01/2007, 14h45
  5. Socket client serveur
    Par rhdjml dans le forum Langage
    Réponses: 2
    Dernier message: 08/03/2006, 12h09

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