C Socket Write ajoutant des caractères supplémentaires

J’essaie d’append “” aux messages d’un programme de discussion. Dans l’exemple ci-dessous, buf est un tableau de caractères contenant le message. Ce qui est bizarre, c’est que lorsque j’envoie ceci à un socket avec write (), il l’envoie en 2 rafales. La première rafale est le bon message, puis une seconde rafale est composée de 2-3 caractères ascii aléatoires non alphabétiques. Une idée de ce qui se passe? Quand je viens d’envoyer un message, cela fonctionne correctement.

char nickmsg[550]; strcpy(nickmsg, " "); strcat(nickmsg, buf); write(sd, nickmsg, sizeof(nickmsg)); 

Vous ne voulez pas sizeof (nickmsg), vous voulez strlen (nickmsg). En utilisant sizeof (nickmsg), vous envoyez tout ce qui est dans ce tampon, pas seulement la chaîne que vous y avez intégrée. S’il ne s’agit que des caractères de la chaîne que vous souhaitez envoyer, vous devez calculer la longueur de ce qu’il y a dedans. (au fait, il existe des moyens plus efficaces de créer des chaînes que des chaînes répétées)

Vous avez ce code:

 char nickmsg[550]; strcpy(nickmsg, "<"); strcat(nickmsg, username); strcat(nickmsg, "> "); strcat(nickmsg, buf); write(sd, nickmsg, sizeof(nickmsg)); 

Cela envoie toujours 550 octets, puisque sizeof(nickmsg) est 550. La fin du message sera marquée par un zéro octet, car nicknmsg est une chaîne de style C.

Si le destinataire saisit toujours 550 octets et ignore tous les octets après le zéro, cela fonctionnera correctement. Vous allez simplement envoyer des octets de courrier indésirable aux clients susceptibles de divulguer des informations sensibles.

La question est, qu’est-ce que vous êtes censé envoyer? Qu’est-ce qui est censé marquer la fin du message?

Attention : Ne changez pas sizeof(nickmsg) en strlen(nickmsg) . Cela ne laissera aucun moyen au client d’identifier la fin du message. (À moins que vous ne soyez 100% positif, le client n’a pas besoin d’identifier la fin des messages.)

write() n’envoie pas de caractères supplémentaires, vous l’ êtes.

 write(sd, nickmsg, sizeof(nickmsg)); 

Enverra 500 caractères (la taille de votre tableau). Comme vous n’avez pas initialisé tous les éléments du tableau à 0 vous récupérez tout le contenu de la mémoire qui dépasse les données que vous y avez insérées.

Tu veux:

 write(sd, nickmsg, strlen(nickmsg) + 1); 

Vous envoyez des données de 500 octets, dans lesquelles seul le premier strlen (nom d’utilisateur) +3 contient des données valides. Le rest ne concerne que les données non initialisées.

Si vous l’envoyez de cette façon, écrivez (sd, nickmsg, sizeof (nickmsg)); vous envoyez des données équivalentes à la taille de la mémoire tampon.Lorsque votre chaîne peut être une chaîne de caractères valide se terminant par un caractère nul, le client peut ne pas traiter les chaînes de cette façon. (Si vous écrivez votre propre programme client, vous pouvez masquer la programme du client).