我用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
是{我不认为这也是解决问题的方法。
我知道每个字符串都是自己终止的,我不是在寻找这些信息。我正在尝试的是将我自己的意志附加到流中,这是在特定点的一个字节的空终止符。有没有其他功能可以帮助我做到这一点,我不知道?
感谢您的时间!
答案 0 :(得分:2)
send(mySocket, stringToSend, strlen(stringToSend), 0);
问题出在这里。缓冲区中已有一个尾随空值,但是您无法发送它。试试这个:
send(mySocket, stringToSend, strlen(stringToSend)+1, 0);
你也误导了这个:
printf("Size of this \\0 is <%ld>\n", sizeof("\0"));
打印sizeof "\0"
,而不是sizeof "\\0"
,这是你想要的,应该是3.这都是无关紧要的。
答案 1 :(得分:-1)
不要逃避\ 0
char *s = "\0";
send(mySocket,s,1,0);
答案 2 :(得分:-1)
使用
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:如果我提出你的问题,别忘了接受。