我已经成功地用C创建了一个TCP客户端/服务器模型。 一切都运行良好,所以我不希望这个问题被误解为如何用 C 编写 TCP 客户端/服务器。
我想要的只是通过流发送一个空终结器(大小为一个字节)。
假设客户端只发送,服务器接收。 我开始了以下一段代码,但它有一些问题(我正在寻找一些帮助)
/* 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(" "));
return 0;
}
端子输出:
bash$>./test
Null in ASCII is <0>
Size of null is <1>
Size of this is <2>
bash$>
简而言之,对于strcat(stringToSend,"\0");
,我只是将'''0'
字符添加到字符串中,仅此而已。
我尝试在客户端使用strcat(stringToSend,(char) 0)
在字符串中附加空字符(1 字节)以发送到流,但我解决了strcat
和strcpy
需要一个指针而不是 INT 的问题((char) 0
是,我认为这也不是解决问题的一种方式。
我知道每个字符串本身都是以 null 结尾的,我不是在寻找这些信息。我所尝试的只是按照我自己的意愿将流附加到流中,这个在特定点的一个字节的空终止符。还有其他我不知道的功能可以帮助我做到这一点吗?
谢谢你的时间!
send(mySocket, stringToSend, strlen(stringToSend), 0);
问题就在这里。缓冲区中已经有一个尾随 null 才能正常工作,但您没有发送它。试试这个:
send(mySocket, stringToSend, strlen(stringToSend)+1, 0);
你也这样误导自己:
printf("Size of this \0 is <%ld>n", sizeof(" "));
打印sizeof " "
,而不是sizeof "\0"
,这是你想要的,应该是3。这都是无关紧要的。
不要转义 \0
char *s = " ";
send(mySocket,s,1,0);
使用
memcpy(your_buffer,your_string,strlen(your_string)+1);/*this copies a
string with its null terminator,
for the next string if your_buffer has allocated enough
memory space (more than strlen(your_string)+strlen(your_other_string)+2*(NULL terminators)
then:*/
memcpy(your_buffer+strlen(your_string)+1,your_other_string,strlen(your_other_string)+1);
// now your_buffer contains your 2 strings with their null terminators
send(your_socket, your_buffer, (strlen(your_string)+strlen(your_other_string)+2)*sizeof(char), 0);//You've now sent your two strings with their null terminators to your client
现在这个: '\0'==1 个字节的零位(仅当你的机器实现了 C 数据类型标准时,这很可能会发生,但不要指望这个)。
如果遵循标准,则:"/0"是指向某些字符所在的内存区域的指针,更具体地说,如果我没记错的话,有一个零字节,后跟一个零字节,一个"空空"。
PS1:如果您以这种方式发送服务器"//0",它不会看到 1 个字节的"/0"(其 ASCII 十六进制等于 00),而是看到 1 个字节的"//"(即 2F)和"0"中的一个字节(即 30),因此请谨慎操作。
PS2:这是我的第一个答案,所以如果我需要任何更正,请随时指出。
PS3:如果我回答了你的问题,别忘了接受。