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

时间:2017-04-22 12:01:18

标签: c sockets tcp null stream

我用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个字节)以发送到流但我遇到了strcatstrcpy需要的问题指向工作的指针而不是INT((char) 0是{我不认为这也是解决问题的方法。

我知道每个字符串都是自己终止的,我不是在寻找这些信息。我正在尝试的是将我自己的意志附加到流中,这是在特定点的一个字节的空终止符。有没有其他功能可以帮助我做到这一点,我不知道?

感谢您的时间!

3 个答案:

答案 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:如果我提出你的问题,别忘了接受。