C套接字写入添加额外字符

我试图在聊天程序中附加“”消息。 在下面的示例中,buf是保存消息的字符数组。 奇怪的是,当我使用write()向下发送它时,它会以2个突发发送它。 第一个突发是正确的消息,然后第二个突发是2-3个随机的非字母ascii字符。 有什么想法吗? 当我向sockets发送buf时,它可以正常工作。

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

你不想要sizeof(nickmsg),你想要strlen(nickmsg)。 使用sizeof(nickmsg),您将发送缓冲区中的所有内容,而不仅仅是您在其中构建的字符串。 如果它只是您要发送的字符串中的字符,则需要计算其中的字符长度。 (顺便说一下,创建字符串的方法比重复的strcats更有效)

你有这个代码:

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

总是发送550个字节,因为sizeof(nickmsg)是550.消息的结尾将用零字节标记,因为nicknmsg是C风格的字符串。

如果接收器总是抓取550个字节并忽略零后的所有字节,这将正常工作。 您只需向客户端发送一些垃圾字节,这可能会泄漏敏感信息。

问题是,你应该发送什么? 什么应该标志着消息的结束?

注意 :不要将sizeof(nickmsg)更改为strlen(nickmsg) 。 这将使客户端完全无法识别消息的结束。 (除非您100%肯定,否则客户端不需要识别消息的结尾。)

write()不会发送额外的字符, 是。

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

将发送500个字符(数组的大小)。 由于您没有将所有数组元素初始化为0您将获取内存中的垃圾,而不是您插入数据中的数据。

你要:

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

您正在发送500字节数据,其中只有第一个strlen(用户名)+3具有有效数据。 其余的只是未初始化的数据。

如果你这样发送写(sd,nickmsg,sizeof(nickmsg)); 你发送的数据相当于缓冲区的大小。虽然你的字符串可能是有效的c字符串以空字符结尾但仍然客户端可能没有这样处理字符串。(如果你正在编写自己的客户端程序,你可能会掩盖在客户的计划)。