【发布时间】:2017-09-19 09:59:10
【问题描述】:
我已经成功地用 C 创建了一个 TCP 客户端/服务器模型。 一切正常,所以我不希望这个问题被误认为是关于如何用 C 编写 TCP 客户端/服务器。
我想要的只是通过流发送一个 NullTerminator(大小为一个字节)。
假设客户端仅发送而服务器正在接收。 我开始使用以下代码,但它有一些问题(我正在寻找一些帮助)
/* client code*/
strcpy(stringToSend,argv[i]);
strcat(stringToSend,argv[i+1]);
strcat(stringToSend,"\\0"); //note that double '\\' refers on escaping the '\'
strcat(stringToSend,argv[i+2]);
send(mySocket, stringToSend, strlen(stringToSend), 0);
/* client code*/
但是快速浏览一下下面的代码(及其结果),它对我正在处理的问题是不言自明的:
#include <stdio.h>
int main(){
printf("Null in ASCII is <%d>\n", ((char) 0));
printf("Size of null is <%ld>\n", sizeof((char)0));
printf("Size of this \\0 is <%ld>\n", sizeof("\0"));
return 0;
}
终端输出:
bash$>./test
Null in ASCII is <0>
Size of null is <1>
Size of this \0 is <2>
bash$>
简而言之,strcat(stringToSend,"\\0"); 我只是将字符 '\''0' 添加到字符串中,仅此而已。
我尝试在客户端使用strcat(stringToSend,(char) 0) 在字符串中附加空字符(1 个字节)以发送到流,但我遇到了strcat 和strcpy 需要指针才能工作而不是INT((char) 0 是,我不认为这也是解决问题的方法。
我知道每个字符串本身都是空终止的,我不是在寻找这些信息。我所尝试的只是将我自己的意愿附加到流中,这个空终止符在特定点处有一个字节。还有其他我不知道的功能可以帮助我做到这一点吗?
感谢您的宝贵时间!
【问题讨论】:
-
我认为你误解了
str*函数......这些库函数不知道字符串有多长......每次调用这些函数时,它们(重新)计算字符串长度根据字节流中的第一个 NUL 字符...考虑使用memcpy,否则当您组合字符串时,您的 NUL 字符将被覆盖。