如何在套接字流缓冲区中添加空终止. C.



我已经成功地用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 字节)以发送到流,但我解决了strcatstrcpy需要一个指针而不是 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:如果我回答了你的问题,别忘了接受。

最新更新