InvaLidOperationException après envoi de Message par Socket Asynchrone

Signaler
Messages postés
10
Date d'inscription
mercredi 24 novembre 2004
Statut
Membre
Dernière intervention
19 juin 2010
-
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
-
Bonjour,

Dans une application Client/serveur de messagerie instantannée j'ai les fonctions suivantes permettant la réception d'un message envoyé.

Code :
 
publicvoid ReceiveMessage(){if(this.SocketClient != null && this.SocketClient.Connected){//On se met en attente d'un message
readbuf = newbyte[1024];//par Exemplethis.SocketClient.BeginReceive(this.readbuf, 0, this.readbuf.Length, SocketFlags.None, new AsyncCallback(ReceiveMessageCallback), this.SocketClient);
}else{
MessageBox.Show("Client non connecté");
}}
 
privatevoid ReceiveMessageCallback(IAsyncResult asyncResult){string[] displaydata;
try{//On récupère le socket de la connection
Socket socket = (Socket)asyncResult.AsyncState;
//On lis les byte qui sont envoyé par le clientint read = socket.EndReceive(asyncResult);
 
// On a reçu des donnéesif(read > 0){//on affiche le message dans un MessageBox
MessageBox.Show(Encoding.ASCII.GetString(this.readbuf));
 
//on les ajoute a la fenetre message et on l'ouvre
message = new Message(this);
message.ajout_message(Encoding.ASCII.GetString(this.readbuf));
message.ShowDialog();
 
// reset du buffer//Buffer.SetByte(this.readbuf, 0, 0);
readbuf = newbyte[1024];
//On se remet en attente d'un messagethis.SocketClient.BeginReceive(this.readbuf, 0, this.readbuf.Length, SocketFlags.None, new AsyncCallback(ReceiveMessageCallback), this.SocketClient);
 
message.ShowDialog();
}// Fermeture socket distante. On ferme la socket cliente localeif(read == 0 && !this.LocalsocketClientIsShutingDown){
socket.Close();
displaydata = newstring[]{"Socket distante fermée."};
message.ajout_message("Socket Distante fermée");
//On se remet en attente de la connection d'un client this.ServerSocket.BeginAccept(new AsyncCallback(ConnectionAcceptCallback), this.ServerSocket);
}}catch(SocketException ex){
MessageBox.Show(ex.Message);
}catch(InvalidOperationException io){
MessageBox.Show(io.Message);
}}
 

La réception du message se fait correctement mais lorsque je ferme la fenêtre de Message, elle apparaît une seconde fois à l'identique, et lorsque je la ferme une deuxième fois j'ai cette erreur :

Or le
<!-- BEGIN TEMPLATE: bbcode_code -->

Code :
 
catch(InvalidOperationException io)
 

<!-- END TEMPLATE: bbcode_code -->à bien été fait, je ne comprend pas pourquoi j'ai cette erreur.
Merçi ...<!-- / message -->

3 réponses

Messages postés
10
Date d'inscription
mercredi 24 novembre 2004
Statut
Membre
Dernière intervention
19 juin 2010

Désolé le code n'est pas passé le voici :

public

void ReceiveMessage(){

if (
this.SocketClient !=
null &&
this.SocketClient.Connected){

//On se met en attente d'un messagereadbuf =

new
byte[1024];
//par Exemple

this.SocketClient.BeginReceive(
this.readbuf, 0,
this.readbuf.Length,
SocketFlags.None,
new
AsyncCallback(ReceiveMessageCallback),
this.SocketClient);}

else{

MessageBox.Show(
"Client non connect‚");}

}

private
void ReceiveMessageCallback(
IAsyncResult asyncResult){

string[] displaydata;

try{

//On r‚cupŠre le socket de la connection

Socket socket = (
Socket)asyncResult.AsyncState;

//On lis les byte qui sont envoy‚ par le client

int read = socket.EndReceive(asyncResult);

// On a re‡u des donn‚es

if (read > 0){

//on affiche le message dans un MessageBox

MessageBox.Show(
Encoding.ASCII.GetString(
this.readbuf));

//on les ajoute a la fenetre message et on l'ouvremessage =

new
Message(
this);message.ajout_message(

Encoding.ASCII.GetString(
this.readbuf));message.ShowDialog();

// reset du buffer

//Buffer.SetByte(this.readbuf, 0, 0);readbuf =

new
byte[1024];

//On se remet en attente d'un message

this.SocketClient.BeginReceive(
this.readbuf, 0,
this.readbuf.Length,
SocketFlags.None,
new
AsyncCallback(ReceiveMessageCallback),
this.SocketClient);}

// Fermeture socket distante. On ferme la socket cliente locale

if (read == 0 && !
this.LocalsocketClientIsShutingDown){

socket.Close();

displaydata =

new
string[] {
"Socket distante ferm‚e." };message.ajout_message(

"Socket Distante ferm‚e");

//On se remet en attente de la connection d'un client

this.ServerSocket.BeginAccept(
new
AsyncCallback(ConnectionAcceptCallback),
this.ServerSocket);}

}

catch (
SocketException ex){

MessageBox.Show(ex.Message);}

catch (
InvalidOperationException io){

MessageBox.Show(io.Message);}

}
Messages postés
296
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
18 août 2008

Euh c'est peut etre une question bete, mais un "try" ne doit pas etre associé qu'à un seul "catch" ?
Et sinon pourquoi ne pas fqire directement :
catch (
Exception ex){

MessageBox.Show(ex.Message);}

On peut écrire francais sur un clavier allemand , c'est juste plus long !!!
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
18
apres un try, tu peux faire autant de catch que tu veux, sachant qu'on passe dans les catch par ordre séquentiel, donc il faut respecter la hiérarchie des exceptions. donjc si tu fais

catch(ThreadAbordException e)
{
}
catch (Exception e)
{
}

tu auras bien 2 traitements différents, alors que si tu fais

catch (Exception e)

{

}
catch(ThreadAbordException e)

{

}

tu ne passera que dans le premier catch (ThreadAbordException dérivant de exception)

l'intéret est d'avoir plusieurs traitements différents selon le type d'exception. typiquement, pour l'exemple ci dessus, tu le fera souvent dans un thread qui doit pouvoir etre interrompu pendant un traitement susceptible de lever des exceptions, et dans le catch threadabortexception tu fera un throw, tandis que tu traitera autrement lexception dans tous les autres cas.