将数据附加到字符数组中的空字符以通过套接字发送数据

时间:2009-09-15 02:01:12

标签: c sockets

我是一名新手程序员。我有一个问题,如下所示,

void SockSend()  
{  
char *sendbuf;  
int sendsize;   /* send data size(variable size)*/  
int iPos = 0, iTotSize;  
char hdr;  
char *data = "ABCDEFGHIJKLMNO";   /* its just example, data can be any thing */  
sendsize = strlen(data);  

hdr = '\0';   /* header character */  
sendbuf = (char*)malloc(sendsize + 2);  
sendbuf[iPos] = hdr;  
iPos++;  
strncpy(sendbuf + iPos, data, 15);  
iPos += sendsize;  
sendbuf[iPos] = '\0';   /* append null at end of string*/  

iTotSize = strlen(sendbuf);  

send(sockid, sendbuf, iTotSize, 0);  
}

在上面的代码中,我需要发送附加了标题字符的数据。 如果标题ascii字符在1h之间 - ffh而不是0h正常工作。 我知道如果将null添加到字符串,则将其视为字符串的结尾。 但我需要通过套接字向数据发送NULL字符。 任何人都可以帮我解决这个问题。

提前谢谢

5 个答案:

答案 0 :(得分:4)

如果要避免Null终止,则必须停止将数据视为字符串。 strcpy意味着只复制以null结尾的字符串。它被实现为复制每个字节直到它遇到#0。 memcpy可以复制任何内存位置。它不受以null结尾的字符串的约束。由于memcpy无法确定要复制的数据的大小,因此您必须提供该信息。此外,您不应该使用strlen,因为它受相同的终止规则约束。

答案 1 :(得分:1)

iTotSize = strlen(sendbuf);
一旦找到空字符,

strlen(sendbuf)将停止计算字符数。

通过手动添加各种尺寸计算总尺寸

也许这可以提供帮助:iTotSize = 1 + strlen(sendbuf + 1);

答案 2 :(得分:1)

如果您必须处理包含'\0'的数据,请分别保留其尺寸并使用memcpy代替strcpystrncpy

请注意,在您的示例中,在将内存分配给sendbuf时,您已经计算了数据包的正确长度。只需使用该值(-1)。另请注意,您确保在send buf中为数据确保了足够的空间,因此您可以安全地使用strcpy。当达到限制时,strncpy不会终止输出字符串 - 容易出错。

使用C中的尺寸时,请使用size_t中定义的stdlib.h类型而不是int

希望有帮助...

void SockSend()  
{  
    char *sendbuf;  
    int sendsize;   /* send data size(variable size)*/  
    int iPos = 0, iTotSize;  
    char hdr;  
    char *data = "ABCDEFGHIJKLMNO"; 
    sendsize = strlen(data);  /* -- Are you sure that data will not contain \0 ? */

    hdr = '\0';   /* header character */
    sendbuf = (char*)malloc(sendsize + 2);  /* -- Data size calculation! */
    sendbuf[iPos] = hdr;  
    iPos++;  
    strcpy(sendbuf + iPos, data);  
    iPos += sendsize;  
    sendbuf[iPos] = '\0';   /* append null at end of string*/  

    iTotSize = strlen(sendbuf);  

    send(sockid, sendbuf, iTotSize, 0);  
}

答案 3 :(得分:0)

strlen在NUL字符处停止,并且不计算它。 您只需添加一个长度

即可

答案 4 :(得分:0)

正如没有人指出这一点 - 你在这里有内存泄漏。 在发送字节之后和从函数返回之前,需要在某处调用free(sendbuf);

sent()还有可能返回短计数 - 当TCP堆栈接受的数据少于你提供的数据时,即套接字发送缓冲区已满 - 所以你必须检查返回值。