[.Net] Socket, UDP et propriété available

J’ai une applic P2P qui utilise la classe socket pour s’échanger des messages UDP. Ces messages ont une taille variable, suivant le contenu du message.

A un moment dans mon application, je fais ceci:

[code]while(Chaussette.available>0)
{
 MessageBuffer = new byte[Chaussette.available];
 Chaussette.receivefrom(MessageBuffer, Chaussette.available, ref Sender);

 BinReader = new BinaryReader(new MemoryStream(MessageBuffer));

 TheMessage = Message.Uncompress(ref BinReader); // on décompacte le message

 ProcessMessage(TheMessage); // Et on fait ce qu’on doit faire avec :stuck_out_tongue:
}[/code]

Bon mon problème: de temps en temps, mon appli recoit plusieurs messages en même temps: par exemple Chaussette.available = 60, et je sais que c’est 3 messages de 20 octets (venant de la même ip).

Mon MessageBuffer fait 60, mais quand je débuggues l’application, seul les 20 premiers octets sont complétés avec de la données (qui correspond en fait au premier message).

Ca me semble curieux comme comportement, j’aurais pensé que ca m’aurait mis dans le buffer les 3 messages l’un à la suite de l’autre.

En plus ca me claques de temps en temps des exception comme quoi j’essaie de lire en dehors de la plage admise avec le BinReader…

[quote name=‹ [PERE ›]Cil, 9 Jun 2005, 08:37]Mon MessageBuffer fait 60, mais quand je débuggues l’application, seul les 20 premiers octets sont complétés avec de la données (qui correspond en fait au premier message).

Ca me semble curieux comme comportement, j’aurais pensé que ca m’aurait mis dans le buffer les 3 messages l’un à la suite de l’autre.

En plus ca me claques de temps en temps des exception comme quoi j’essaie de lire en dehors de la plage admise avec le BinReader…
[right][post=« 366593 »]<{POST_SNAPBACK}>[/post][/right][/quote]

Ton message buffer fait peut-être 60 octets, mais comme je t’avais déja expliqué, a ce niveau, un datagramme UDP reste un datagramme UDP, et en aucun cas, la pile UDP doit recoller des datagrammes distincts.

Note : tu peux récupérer la taille du message recu en utilisant la valeur retrournée par ReceiveFrom…

Sinon, pour tes problemes de BinaryReader, je soupconne que ca soit ta déserialisation du message qui pose problème…

Ouais mais eh, c’est mal foutu… comment je dimensionne mon buffer si c’est après la lecture que je connais la taille du paquet?

[edit] ouais c’est con je pourrais le dimensionner a une taille fixe au départ… mais je m’expose ensuite a des buffer overflow. Le buffer overflow, c’est MAL.

[quote name=’[PERE]Cil’ date=’ 9 Jun 2005, 09:02’][edit] ouais c’est con je pourrais le dimensionner a une taille fixe au départ… mais je m’expose ensuite a des buffer overflow. Le buffer overflow, c’est MAL.
[right][post=“366606”]<{POST_SNAPBACK}>[/post][/right][/quote]

Huhu, buffer overflow dans un code managé … nan, pas de buffer overflow. Tu te prends une exception pasque ton buffer il est trop petit.
Donc, deux solutions : 1. Tu copies le buffer dans un autre de la bonne taille.
2. En .net 2.0, tu redimentionne avec Array.Resize

Ouais je sais pas de risque d’overflow en .net mais c’est pas une raison pour coder comme un porc non plus :P. J’ai trouvé la solution j’ai fout la taille de mon buffer interne a la taille du buffer du Socket. Plus de risque de ce coté la, et ca passe impec. (du moins je déplaces les risques d’exception :P).