Problème de reception socket

Problème de reception socket - C#/.NET managed - Programmation

Marsh Posté le 17-02-2005 à 20:00:46    

Bonsoir,  
J’en appelle à votre aide car je débute en programmation et je rencontre certaines difficultés.
Je m’essaye à la communication par socket et j’ai un problème avec la réception des données.
Ainsi lorsque j’envoie depuis mon client une trame par exemple de 4 caractères mon serveur reçoit aléatoirement soit les 5 caractères soit autant de caractères qu’il y a dans mon buffer de réception.      
J’aimerai trouver une solution pour toujours obtenir la même trame.  
Exemple :

Code :
  1. byte[] b_buffer=new byte[10];
  2. client.Receive(b_buffer);
  3. /* j’obtient aléatoirement  dans le buffer «allo\0\0\0\0\0\0» (ce que je souhaite) ou bien «allo125658» */


 
Merci de votre aide  :hello:  

Reply

Marsh Posté le 17-02-2005 à 20:00:46   

Reply

Marsh Posté le 17-02-2005 à 20:14:22    

Facile. Je suppose que client est un objet de type socket, et que tu travailles en TCP (ie mode connecté).
 
Dans la fonction receive, tu peux spécifier le nombre d'octets max à lire d'un coup.
Le code le plus correct est celui là, je pense.
 

Code :
  1. int nbOctetsRecus=0;
  2. int length=4;
  3. do
  4. {
  5. nbOctetsRecus=client.Receive(b_buffer,4-length,length,SocketFlags.None);
  6. length-=nbOctetsRecus;
  7. }while(length>0 && nbOctetsRecus>0); //si nbOctetsRecus==0 alors la connexion a été coupée
  8. // ici, ton buffer est plein (length==0), ou alors la connexion a été coupée (nbOctetsRecus==0)
  9. if (nbOctetsRecus>0)
  10. {
  11. //La trame est bonne, il reste à la lire
  12. }
  13. else
  14. {
  15. //Connexion perdue :)
  16. }


Reply

Marsh Posté le 17-02-2005 à 20:15:58    

Petite précision : rien ne t'assure que tu va recevoir 4 octets d'un coup (même si c'est quasi certain), d'où la petite boucle qui attends qu'on au bien recu 4 octets (length passe de 4 à 0), et qui décale l'endroit ou on écrit dans le buffer (4 - length).

Reply

Marsh Posté le 17-02-2005 à 20:21:53    

Merci de ton aide  ;)  
Et si je ne connais pas la taille de la trame que je vais recevoir ?  :??:

Reply

Marsh Posté le 17-02-2005 à 20:26:19    

bein tu met une length suffisemment grande avec un buffer de meme taille derrière.
Le souci, c'est que si tu connais pas la taille, il va te falloir un autre moyen de détecter que la trame est finie, ce qui veut dire, il va te falloir un protocole de communication derrière.
 
Ex à la con : un entier sur 32 bits en début de chaque trame qui indique la taille de la trame qui vient.

Reply

Marsh Posté le 17-02-2005 à 20:42:03    

Merci beaucoup , je m'en douté un peu mais j'avais l'éspoir qu'il y ai un truc ... merci de ton aide  :jap:  :jap:

Reply

Marsh Posté le 17-02-2005 à 20:53:01    

Et pour la curiosité, quelqu'un pourrait me dire pourquoi des fois j'ai la trame que je désire et l'instant d'après j'ai un truc différent ? :sweat:

Reply

Sujets relatifs:

Leave a Replay

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