Création et utilisation d´une dll (erreur ArgumentOutOfRangeException )

Résolu
tendence Messages postés 2 Date d'inscription vendredi 19 novembre 2004 Statut Membre Dernière intervention 15 août 2005 - 11 août 2005 à 13:05
tendence Messages postés 2 Date d'inscription vendredi 19 novembre 2004 Statut Membre Dernière intervention 15 août 2005 - 15 août 2005 à 02:10
Bonjour j´ai réalisé une petite application d´un client mail, dans l´état basique des choses je n´ai implémenté que les fonctionnalité de base décrite dans un ancien RFC 821 ou 822.

puis j´ai décidé de séparer mon exe en module apès la création d´un package.

l´appel au fonction interface se passe bien mais le programme ne fonctionne pas comme avant, je crois que la cause à un rapport avec la durée vie des objets.

en tout cas lors de la connextion avec le serveur pop il retourne une exception suivante

System.ArgumentOutOfRangeException: Index and length must refer to a location within the string.
Parameter name: length
at System.String.Substring(Int32 startIndex, Int32 length)
at bibClass_cafe.Pop3.Connect(String server, String username, String password) in c:\Documents and Settings\test\Mes documents\SharpDevelop Projects\bibClass_cafe\Pop3.cs:line 53
at MainForm.ButPOPClick(Object sender, EventArgs e) in c:\Documents and Settings\test\Mes documents\SharpDevelop Projects\café_mail2\MainForm.cs:line 439

une exception que je n´ai pas compris


try


{


obj
= new Pop3 ();


obj
.Connect(PopServer
.Text
, login
.Text
, Passwd
.Text
);


list
= obj
.List();


foreach ( Pop3Message msg
in list
)


{


listBox
.Items
.Add("Message "+ msg
.number
+", de taille "+ msg
.bytes
);


}



le package se trouve dans plusieur fichiers :


using System
.Collections
;


//necessaire pour networkstream


using System
.Net
.Sockets
;


//necessaire pour l'appel de la classe diagnostic


using System
.Diagnostics
;


using System
;


namespace bibClass_cafe


{


/// <summary>


/// Description of Pop3.


/// </summary>


public class Pop3 : System
.Net
.Sockets
.TcpClient



{


public Pop3()


{


}


public void Connect(string server
, string username
, string password
)


{


string message
;


string response
;


Connect(server
, 110);


response
= Response ();


if (response
.Substring(0, 3) ! = "+OK")


{


throw new Pop3Exception(response
);


}


message
= "USER " + username
+ "";


Write (message
);


response
= Response();


if (response
.Substring(0, 3) != "+OK")


{


throw new Pop3Exception (response
);


}


message
= "PASS " + password
+ "";


Write(message
);


response
= Response ();


if (response
.Substring(0, 3) ! = "+OK")


{


throw new Pop3Exception(response
);


}


}


public void Disconnect()


{


string message
;


string response
;


message
= "QUIT";


Write (message
);


response
= Response();


if (response
.Substring(0, 3) != "+OK")


{


throw new Pop3Exception (response
);


}


}


public ArrayList
List()


{


string message
;


string response
;


ArrayList retval
= new ArrayList();


message
= "LIST";


Write (message
);


response
= Response();


if (response
.Substring(0, 3) != "+OK")


{


throw new Pop3Exception (response
);


}


while (true)


{


response
= Response();


if (response
".")


{


return retval
;


}


else


{


Pop3Message msg
= new Pop3Message ();


char[] seps
= {' ',''};


string[] values
= response
. Split (seps
);


msg
.number
= Int32
.Parse(values
[0]);


msg
.bytes
= Int32
. Parse (values
[1]);


msg
.retrieved
= false;


retval
.Add(msg
);


//MessageBox.Show ("bonjour "+'*'+msg.number+'*'+msg.bytes);


continue;


}


}


}


public Pop3Message
Retrieve(Pop3Message rhs
)


{


string message
;


string response
;


Pop3Message msg
= new Pop3Message ();


msg
.bytes
= rhs
.bytes
;


msg
.number
= rhs
.number
;


message
= "RETR " + rhs
.number
+ "";


Write (message
);


response
= Response();


if (response
.Substring(0, 3) != "+OK")


{


throw new Pop3Exception (response
);


}


msg
.retrieved
= true;


while (true)


{


response
= Response ();


if (response
== ".")


{


break;


}


else


{


msg
.message
+= response
;


}


}


return msg
;


}


public void Delete(Pop3Message rhs
)


{


string message
;


string response
;


message
= "DELE " + rhs
.number
+ "";


Write(message
);


response
= Response ();


if (response
.Substring(0, 3) ! = "+OK")


{


throw new Pop3Exception(response
);


}


}


private void Write(string message
)


{


System
.Text
.ASCIIEncoding en
= new System
.Text
.ASCIIEncoding() ;


byte[] WriteBuffer
= new byte[1024] ;


WriteBuffer
= en
. GetBytes (message
) ;


NetworkStream stream
= GetStream() ;


stream
.Write(WriteBuffer
,0,WriteBuffer
.Length
);


Debug
.WriteLine("WRITE:" + message
);


}


private string Response()


{


System
.Text
.ASCIIEncoding enc
= new System
.Text
.ASCIIEncoding();


byte []serverbuff
= new Byte
[1024];


NetworkStream stream
= GetStream ();


int count
= 0;


while (true)


{


byte []buff
= new Byte
[2];


int bytes
= stream
.Read( buff
, 0, 1 );


if (bytes
1)


{


serverbuff
[count
] = buff
[0];


count
++;


if (buff
[0] == '')


{


break;


}


}


else


{


break;


};


};


string retval
= enc
.GetString( serverbuff
, 0, count
);


Debug
.WriteLine("READ:" + retval
);


return retval
;


}


}


}



puis dáutre classes


namespace bibClass_cafe


{


/// <summary>


/// Description of Class1.


/// </summary>


public class Pop3Message


{


public long number
;


public long bytes
;


public bool retrieved
;


public string message
;


};


}



ET LA DERNIERE


using System
;


namespace bibClass_cafe


{


/// <summary>


/// Description of PopClass.


/// </summary>


public class Pop3Exception : System
.ApplicationException



{


public Pop3Exception()


{


}


public Pop3Exception(string str
):base
(str
)


{


}


};



NOTE : j´ai utilisé Sharpdevlop

3 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
11 août 2005 à 14:18
Salut j'ai pas tout regardé mais l'exception te dit que tu as un problème avec les instances de "SubString( 0, 3 )", 3 n'est pas une position dans la chaine.
3
titeoe Messages postés 433 Date d'inscription samedi 26 avril 2003 Statut Membre Dernière intervention 4 décembre 2009 1
11 août 2005 à 17:04
En effet , avant de faire un substring , assures toi toujorus de :
1/ chaine non vide
2/ lenght > 3
3
tendence Messages postés 2 Date d'inscription vendredi 19 novembre 2004 Statut Membre Dernière intervention 15 août 2005
15 août 2005 à 02:10
merci pour vos réponse,
si je n'ai pas répondu parce ke j'etai en déplacement

j'ai réalisé quelque test, j'ai augmenté la duré pour laquelle la connexion ne serra pas intérompu (la variable timeOut dans TcpClient).

l'erreur coorespandant à substring n'est plus mai il y a une autre erreur de type le serveur distant ne répond pas convenablement.

au cour de l'etablissement de la connexion j'utilise les fonction write et response pour cfommuniqué avec le serveur mais aparament lors du troisième appel de l'une de ces deux fonctions leurs execution est étoufé

comme je croyai la premiere erreur etait du au temps qu'il ne faut pas dépasser entre l'appel des différents fonction avec la communiccation avec un serveur distant surtout si le temps de propagation est important

mai maintenant je crois ke la nouvelle eerrreur est du à un kelkechose en rapport avec la pile ou l'ercasement des zone mémoire partagé propore au DLL.

la discussion est ouverte
3
Rejoignez-nous