Socket: probleme reception donnée (temp d'attente?)
warenbe
Messages postés145Date d'inscriptiondimanche 2 décembre 2001StatutMembreDernière intervention10 septembre 2009
-
2 oct. 2006 à 23:47
warenbe
Messages postés145Date d'inscriptiondimanche 2 décembre 2001StatutMembreDernière intervention10 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?
leprov
Messages postés1160Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 octobre 201017 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).
MoDDiB
Messages postés546Date d'inscriptionmardi 26 novembre 2002StatutMembreDernière intervention 4 mai 20071 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.
warenbe
Messages postés145Date d'inscriptiondimanche 2 décembre 2001StatutMembreDernière intervention10 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é
Vous n’avez pas trouvé la réponse que vous recherchez ?