首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C套接字写入添加额外字符

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

Stack Overflow用户
提问于 2011-11-13 10:13:50
回答 5查看 4K关注 0票数 0

我正在尝试将“”附加到聊天程序中的消息。在下面的示例中,buf是一个保存消息的字符数组。奇怪的是,当我使用write()将其发送到套接字时,它会以两个突发的形式发送它。第一个脉冲串是正确的消息,然后第二个脉冲串是2-3个随机的非字母ascii字符。知道怎么回事吗?当我只向套接字发送buf时,它可以正常工作。

代码语言:javascript
复制
char nickmsg[550];
strcpy(nickmsg, "<");
strcat(nickmsg, username);
strcat(nickmsg, "> ");
strcat(nickmsg, buf);
write(sd, nickmsg, sizeof(nickmsg));
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-11-13 10:16:02

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

票数 5
EN

Stack Overflow用户

发布于 2011-11-13 10:21:06

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

代码语言:javascript
复制
write(sd, nickmsg, sizeof(nickmsg));

将发送500个字符(数组的大小)。因为您没有将所有数组元素初始化为0,所以您将获得内存中除了插入的数据之外的任何垃圾。

您需要:

代码语言:javascript
复制
write(sd, nickmsg, strlen(nickmsg) + 1);
票数 1
EN

Stack Overflow用户

发布于 2011-11-13 10:32:09

你有这样的代码:

代码语言:javascript
复制
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%肯定的,否则客户端不需要识别消息的结尾。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8109121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档