Bonjour,

J'ai l'impression qu'il y a peut-être un problème de comportement avec la fonction sfPacket_ReadString(), à moins que ce ne soit le comportement esconté,

Code : Sélectionner tout - Visualiser dans une fenêtre à part
CSFML_API void  sfPacket_ReadString(sfPacket* Packet, char* String);
Apparemment le paramètre String fourni doit avoir une taille supérieure ou égale aux données reçues et qui vont être placées dans ce buffer (si la taille est inférieure, j'obtiens une erreur de segmentation).

Là où je m'étonne c'est qu'il n'y a pas de paramètre 'int size' pour indiquer la taille du buffer fourni, pour éviter de faire une erreur de segmentation.
Je ne comprends pas non plus pourquoi la fonction ne retourne pas le nombre d'octets remplis dans le buffer, ce qui rend cette fonction assez difficile d'emploi, si elle est utilisée seule.

Le workaround que j'ai trouvé c'est d'utiliser sfPacket_WriteUint32() avant sfPacket_WriteString() pour indiquer la taille, et le l'autre côté faire d'abord un sfPacket_ReadUint32() puis un alloc de la taille obtenue pour fournir ce buffer à sfPacket_ReadString().

Ce qui me fait penser que ce n'est peut-être pas le comportement escompté c'est que dans le code source de Packet.cpp la longueur de la chaine est déjà enregistrée puis lue à la réception. Ce qui fait qu'avec mon astuce la taille de la chaine est enregistré en double.

Cependant c'est peut-être moi qui n'ai pas bien compris comment utiliser cette fonction.

J'ai également des résultats aléatoires lorsque je tente de transmettre du binaire qui parfois contient un octet null, ce qui s'explique de par le fait que sfPacket_WriteString() utilise '\0' pour connaitre la taille. Mais peut-être qu'on est sensé transmettre que de l'ascii ?

Si vous pouviez m'éclairer sur la question, je vous en saurais gré.