Socket asynchrone

Socket asynchrone - C#/.NET managed - Programmation

Marsh Posté le 20-04-2006 à 17:00:46    

Bonjour
J'ai cree une classe de socket
Mais jai un soucis pour la reception
Voila se que j'ai fait pour linstant :
 

Code :
  1. public void recvmsg()
  2.  {
  3.             if (this.sockclient != null && this.sockclient.Connected)
  4.             {
  5.                 //On lance la reception.
  6.                 this.sockclient.BeginReceive(this.recvbuf, 0, this.recvbuf.Length, SocketFlags.None, new AsyncCallback(recvcallback), this.sockclient);
  7.             }
  8.             else
  9.             {
  10.                 erreur("Erreur de reception: Socket non connecté" );
  11.             }
  12.  }
  13.  /// <summary>
  14.  /// Call back de la methode recvmsg
  15.  /// </summary>
  16. private void recvcallback(IAsyncResult asyncResult)
  17.  {
  18.             try
  19.             {
  20.                 //On récupere le socket sur lequel on a envoyé les données
  21.                 Socket socket = (Socket)asyncResult.AsyncState;
  22.                 //Termine la reception
  23.                 int read = socket.EndReceive(asyncResult);
  24.    string msg = read.ToString();
  25.    MessageBox.Show(msg);
  26.                 //Si on lis + de 0octet c'est que tout le message a ete transmis.
  27.                 if (read > 0)
  28.                 {
  29.                     //Envoie l'information a la methode de traitement de reponse.
  30.     reception(Encoding.ASCII.GetString(this.recvbuf,0,this.recvbuf.Length));
  31.                     //reset buffer
  32.                     Buffer.SetByte(this.recvbuf, 0, 0);
  33.                     //Relance la lecture suivante.
  34.                     this.sockclient.BeginReceive(this.recvbuf, 0, this.recvbuf.Length, SocketFlags.None, new AsyncCallback(recvcallback), this.sockclient);
  35.                 }
  36.                 //Si 0octet sont transmis alors fin de connexion
  37.                 if (read == 0 && !this.etatconnect)
  38.                 {
  39.                     this.deco();
  40.                     erreur("Deconnexion du socket suite a la reception" );
  41.                 }
  42.                 receiveDone.Set();
  43.             }
  44.             catch(SocketException e)
  45.             {
  46.                 erreur("Exeption de connexion dans la reception\n" + e.Message);
  47.                 status = new string[1] { e.Message };
  48.                 receiveDone.Set();
  49.             }
  50.  }


 
Mais le probleme c'est que je sais pas comment faire pour avoir une methode qui maintenant soit comme ca:

Code :
  1. public string reception();


et qui me renvoi directement se que ca recoi  
et egalement que un send corresponde a un receive ( actuellement ca attend que le buffer se remplisse il me semble )


Message édité par korben31 le 20-04-2006 à 17:01:20
Reply

Marsh Posté le 20-04-2006 à 17:00:46   

Reply

Marsh Posté le 20-04-2006 à 23:09:11    

tu devrais peut etre utiliser une socket synchone, vu l'intéret de tes besoins.
 

Code :
  1. public string recvmsg()
  2. {
  3.            if (this.sockclient != null && this.sockclient.Connected)
  4.           {
  5.                byte[] bytes = new byte[this.sockclient.Available];
  6.                this.sockclient.Receive( bytes, 0, bytes.Length, SocketFlags.None) ;
  7.                return Encoding.ASCII.GetString(bytes)
  8.           }
  9. }


 
 bref c'est toi qui voit.


Message édité par darksqual le 20-04-2006 à 23:11:18
Reply

Marsh Posté le 21-04-2006 à 12:53:46    

oué mais la c pu dans un thread non ?
donc ca va etre bloquant pour l'ihm ?
mais ca marche aussi ?

Message cité 1 fois
Message édité par korben31 le 21-04-2006 à 12:54:44
Reply

Marsh Posté le 13-06-2006 à 11:30:46    

korben31 a écrit :

oué mais la c pu dans un thread non ?
donc ca va etre bloquant pour l'ihm ?
mais ca marche aussi ?


 
 
30 ans Plus tard :sleep:  
ça devais marcher.  

Code :
  1. public string recvmsg()       
  2. {           
  3.    if (this.sockclient != null && this.sockclient.Connected)         
  4.    {                //On lance la reception.                 
  5.       System.IAsyncResult ar = this.sockclient.BeginReceive(this.recvbuf, 0, this.recvbuf.Length, 0, null, null);
  6.       int read = s.EndReceive(ar); //le traitement reste bloquer sur cette fonction tant qu’il n’est pas terminé.
  7.  
  8.      string strRetPage = Encoding.Default.GetString(RecvBytes, 0, read);
  9.      return strRetPage;
  10.    }         
  11.    else
  12.    {               
  13.        erreur("Erreur de reception: Socket non connecté" );
  14.    }
  15.    return null;
  16. }

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed