问题描述
我正在尝试将memcpy用作strncat,因为我需要在字符串中保留空终止符 我在尝试理解这段代码中缺少的内容时遇到了麻烦,我不知道如何检查它,但是我认为最终的字符串不正确,这是代码:
char *reass_tcp = malloc(sizeof(char) * 22 + 1);
char *a = "hel\0lo";
char *b = "W\0orld";
char *c = "wha\0ts\0up\r"; //last chunk of payload so it has the carriage
//return which i included here
int len = 0;
memcpy(reass_tcp,a,actualsize(a));
len += actualsize(a);
memcpy(reass_tcp+len,b,actualsize(b));
len += actualsize(b);
memcpy(reass_tcp+len,c,actualsize(c));
return reass_tcp;
原始代码稍微复杂一点,但是可以减少上述问题。 我可以访问函数actualsize(): 此函数返回字符串的实际大小,包括中间的空终止符,但不包括所有C字符串中包含的字符串(字符串末尾的一个)。但是,它确实包括所有tcp数据包末尾包含的回车符。 例如
a = "hel\0lo";
actualsize(a) --> returns 6
c = "wha\0ts\0up\r"
actualsize(c) --> returns 10
更新: 这是场景的样子:
- 我有3个TCP负载块,最后一个仅包含回车符
- 我向所有块手动添加了空终止符
- 我的目标是将它们组合在一起,包括单个字符串之间包含的空终止符,以形成原始有效载荷
解决方法
由于您为空终止符分配了空间,因此应在3个memcpy
调用之后通过添加以下内容来显式设置它:
len += actualsize(c);
reass_tcp[len] = '\0';
如果有效负载中有嵌入的空字节,reass_tcp
仍将是C字符串,但是如果3个块中没有一个嵌入了空字节,则需要终止符。
结果证明代码是正确的,我的错误是在将重组消息作为实际的网络数据包发送之前为重组消息分配了错误的空间