我是一名新手程序员。我有一个问题,如下所示,
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字符。 任何人都可以帮我解决这个问题。
提前谢谢
答案 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
代替strcpy
或strncpy
。
请注意,在您的示例中,在将内存分配给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堆栈接受的数据少于你提供的数据时,即套接字发送缓冲区已满 - 所以你必须检查返回值。