Socket: probleme reception donnée (temp d'attente?)

warenbe Messages postés 145 Date d'inscription dimanche 2 décembre 2001 Statut Membre Dernière intervention 10 septembre 2009 - 2 oct. 2006 à 23:47
warenbe Messages postés 145 Date d'inscription dimanche 2 décembre 2001 Statut Membre Dernière intervention 10 septembre 2009 - 3 oct. 2006 à 12:57
bonjour
(bonsoir plutot)

avant de me coucher j'aimerai poser une question
j'ai un bout de code qui me permet de recuperer des infos sur un serveur
pour le moment ce code est en test. il n'est pas fini
mais il marche

j'aimerai avoir votre avis sur deux choses
1: est il "correct" (propre.) il fonctionne mais je pense qu'il n'est pas tellement optimisé
je developpe pour pocket pc donc en c# avec le .net compact framework. mais toutes les classes que j'utilise existent aussi dans le .net framework "normal"

2: j'ai un probleme:
je suis obligé de mettre un thread.sleep(2000) sinon je ne reçoit pas la reponse du serveur (en l'occurence pour FTP ou alors un GET sur google.fr)
comment puis je eviter ça pour que je ne perde pas de temps pour rien et que j'evite de bloquer le pocket pc?

voici le code:



this

.s = newSocket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType

.Tcp);




IPHostEntry IPhostentry = Dns

.GetHostEntry(sServeur);



IPAddress

[] IPadress= IPhostentry.AddressList;




IPEndPoint EndPoint = newIPEndPoint

(IPadress[0], iPort);



this

.s.Connect(EndPoint);





if (!this

.s.Connected)


{
   


return
"Erreur impossible de se connecter à: "


+ EndPoint.Address.ToString();


}


else


{
   


byte[] buffer = System.Text.Encoding

.UTF8.GetBytes(sParametres);
   


this

.s.Send(buffer);
   


System.Threading.

Thread
.Sleep(2000);
   



string reponse = ""

;






while (this

.s.Available > 0)


{



   int iSizeReponse = this

.s.Available;




   byte[] buffer_reponse = newbyte

[iSizeReponse];




   int count = this

.s.Receive(buffer_reponse);



   reponse = reponse +

Encoding
.UTF8.GetString(buffer_reponse, 0, buffer_reponse.Length);


}




this

.s.Close();





if

(reponse.Length > 0)


{


   return

reponse;


}


else


{



   return
"null"


;


}




merci d'avance

warenbe

la société de consommation porte mal son nom car un con fait rarement une sommation avant de dire une connerie en société

5 réponses

leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
3 oct. 2006 à 11:11
je vois que tu utilise UTF8 pour l'encoding...a priori ca ne fonctionne pas...jimagine que tu l'utilise pour pouvoir passer les caractères accentués...fait un test, tes caractères accentués sont perdus....
en compact framework, la seule solution pour utiliser l'ascii étendu est d'utiliser
Encoding.GetEncoding(0)
Le problème de cette solution est que ton pocket pc DOIT etre configuré en francais. si un utilisateur de ton application installe son pocket pc en anglais, encoding.GetEncoding(0) retourne Encoding.ASCII. Si l'installation est en francais, cela retourne Encoding.GetEncoding("iso-8859-1")
pourquoi ne pas utiliser directement Encoding.GetEncoding("iso-8859-1") ? et bien en framework normal pas de problème, mais en CF, cela lève une notSupportedException (ou une exception de ce style).
0
warenbe Messages postés 145 Date d'inscription dimanche 2 décembre 2001 Statut Membre Dernière intervention 10 septembre 2009
3 oct. 2006 à 11:53
mon pocket pc est en anglais (j'ai changé la rom pour avoir windows 2003 SE)

en fait les commandes passent sans probleme pour le moment car je n'ai pas d'accent...

mais ce que je trouve un peu con c'est de devoir faire un thread sleep avant de recevoir la reponse
n'y a t il pas d'autre moyen?

sinon pour l'encoding je regarderai si la librairie OpenNETCF dispose d'autre classe pour encoder :)
merci du conseil ^^


la société de consommation porte mal son nom car un con fait rarement une sommation avant de dire une connerie en société
0
MoDDiB Messages postés 546 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 4 mai 2007 1
3 oct. 2006 à 12:38
Pour eviter ton Thread.Sleep il faut que tu fasses ton s.Receive(buffer_reponse);
juste après le send car cette méthode est bloquante; en contre partie tu ne connaitra pas la taille du packet donc soit : tu crées un tableau plus grand soit tu envoies d'abord la taille du tableau puis le packet lui même.
0
warenbe Messages postés 145 Date d'inscription dimanche 2 décembre 2001 Statut Membre Dernière intervention 10 septembre 2009
3 oct. 2006 à 12:56
voila la solution pour laquelle j'ai opté:
s.send(buffer)

j'initialise un timer. celui ci se declenchera 3 secondes apres
je le lance
ensuite je cree une boucle while
je reste dans cette boucle tant que s.avalaible est a 0
des que s.avalaible est superieur a 0 j'arette le timer. si le timer arrive a terme avant son arret je dis que c'est un timeout: le serveur n'a rien repondu!

je rentre dans une boucle while

ensuite je cree un tableau de bytes equivalent a s.avalaible. je met dans ce tableau s.receive(tableau)

je copie le contenu de ce tableau dans un string qui contiendra la reponse

la boucle while test s.avalaible. si c'est encore > à 0 alors des données sont encore en attente donc je recupere et je rajoute au string qui contient la reponse

des que c'est a 0 je retourne la reponse...


c'est correct? en tout cas ça marche super :)



la société de consommation porte mal son nom car un con fait rarement une sommation avant de dire une connerie en société
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
warenbe Messages postés 145 Date d'inscription dimanche 2 décembre 2001 Statut Membre Dernière intervention 10 septembre 2009
3 oct. 2006 à 12:57
au fait desolé pour les retour à la ligne manquant mais ce site ne supporte pas opera: ils deteste ses retours à la ligne :(

et la textbox classique ne marche pas :(

bref


la société de consommation porte mal son nom car un con fait rarement une sommation avant de dire une connerie en société
0
Rejoignez-nous