depuis quelques jours, j'essaye de réaliser un salon de discussion un peu compliqué, avec la possibilité de changer de pseudo/image, avec plusieurs salons disponibles.
Pour cela j'ai beaucoup cherché sur internet des exemples de code, et je me suis inspiré du très bon article de http://msdn.microsoft.com/en-us/magazine/cc300760.aspx (Pour la suite de mon post, je me suis inspiré en grande partie de la "Figure 7 Asynchronous Server" du lien précédent, mais j'ai également fait la "Figure 5 Simple Threaded Server" en désespoir de cause...).
Bref, le problème étant que je n'ai jamais utilisé de buffer pour l'envoie des données, et cela me pose problème. En effet il arrive que le serveur passe en "WouldBlock" j'ai donc ajouté ce bout de code que j'ai trouvé sur internet :
Mais j'ai vraiment pas l'impression que cela aide. De plus, j'ai compris que l'envoie des données se fait en respectant l'algorithme de Nagle. Ce qui fait que si le serveur se fait "spammer", le client peut recevoir des données coupées du type :
"Phrase1`Phrase2`Phrase3`Phra"
Alors je ne sais pas du tout si je fait quelque chose de mal. Mais j'ai cru comprendre qu'il fallait utiliser des délimiteurs de "Lignes". Le fait est que du coup les données coté client arrivant en bout de buffer sont intraitables.
La première solution serait de sauvegarder les données arrivant en fin, et de les juxtaposer avec celles arrivant en début de buffer suivant. Mais j'ai envie d'avoir votre avis avant de faire ça, car j'ai l'impression de faire fausse route.
L'essentiel du code du serveur (notamment pour la déclaration du buffer etc, correspond exactement au code de la Figure 7 du lien précédent). Je préfère cependant le rajouter ci-dessous si quelqu'un souhait y avoir accès :
Voila pour la plus grosse partie du code.
J'ai pas vraiment besoin de le signaler, mais c'est vraiment codé très salement.
Je peux ajouter les parties manquantes si nécessaire ainsi que la partie traitement coté client, mais elle ressemble beaucoup a cette partie.
Quoi qu'il en soit concrètement la j'ai deux soucis :
Soit le client reçoit des données incomplète en fin de buffer, donc traite n'importe comment.
Soit le serveur déclanche une socketException WouldBlock.
Voila j'espère ne rien avoir oublié, n'hésitez pas à me demander des compléments.
Toute critique sera appréciée à sa juste valeur, n'hésitez pas, même si cela ne concerne pas les Socket
Merci d'avance à ceux qui sauront me guider.
EDIT 1 :
J'ai décidé de réaliser un petit stockage du contenu de la fin du buffer si celui-ci ne contient pas un délimiteur de fin de ligne à la fin.
Cela règle le soucis coté Client/Serveur du buffer.
Voila le code (bien que très moche) :
Code C# :
...
String endOfBuff = "";
while (true)
{
byte[] buffer = new byte[255];
int bytesRead = connection.Socket.Receive(buffer);
String data;
if (bytesRead > 0)
{
String[] allDatas;
[B]data = endOfBuff;
data += System.Text.Encoding.UTF8.GetString(buffer).TrimEnd('\0').Trim();
endOfBuff = "";
if (!data.EndsWith("`"))
{
endOfBuff = data.Split('`').ElementAt(data.Split('`').Count() - 1);
allDatas = data.Substring(0, data.LastIndexOf('`')).Split('`');
}
else
{
allDatas = data.Split('`');
}[B]
foreach (String l in allDatas)
{
....
Cependant, au bout d'un moment (environ après 2 minutes avec 25 clients envoyant des messages chaque seconde chacun), le serveur s'arrête. Et ce sans prévenir ni erreur etc... Rien n'est à signaler ni coté client, ni coté serveur. Bref, je suis vraiment perdu, quelqu'un à une idée, ou des améliorations à proposer ?
Merci beaucoup, encore une fois, toute aide est appréciée, même minime (S.V.P :$)
Serveur de discussion
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.