我正在尝试将“”附加到聊天程序中的消息。在下面的示例中,buf是一个保存消息的字符数组。奇怪的是,当我使用write()将其发送到套接字时,它会以两个突发的形式发送它。第一个脉冲串是正确的消息,然后第二个脉冲串是2-3个随机的非字母ascii字符。知道怎么回事吗?当我只向套接字发送buf时,它可以正常工作。
char nickmsg[550];
strcpy(nickmsg, "<");
strcat(nickmsg, username);
strcat(nickmsg, "> ");
strcat(nickmsg, buf);
write(sd, nickmsg, sizeof(nickmsg));发布于 2011-11-13 10:16:02
你不需要sizeof(nickmsg),你想要strlen(nickmsg)。使用sizeof(nickmsg),您将发送缓冲区中的所有内容,而不仅仅是您在其中构建的字符串。如果只是想要发送的字符串中的字符,则需要计算其中内容的长度。(顺便说一句,有比重复strcat更有效的方法来创建字符串)
发布于 2011-11-13 10:21:06
write()发送的不是额外的字符,而是您。
write(sd, nickmsg, sizeof(nickmsg));将发送500个字符(数组的大小)。因为您没有将所有数组元素初始化为0,所以您将获得内存中除了插入的数据之外的任何垃圾。
您需要:
write(sd, nickmsg, strlen(nickmsg) + 1);发布于 2011-11-13 10:32:09
你有这样的代码:
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%肯定的,否则客户端不需要识别消息的结尾。)
https://stackoverflow.com/questions/8109121
复制相似问题