C strncat 不工作并引发访问冲突
C strncat not working and raises Access Violation
我正在编写一个 Web 服务器,我在其中通过 WinSock
套接字从客户端接收数据,并将数据解析为多个部分。然后,根据找到的方法和请求的资源,我想建立一个新的数据包,我将发送回客户端。
我有这个功能,用来构建数据包发送nack给客户端:(BUFFER_SIZE=2048
)
char* build_packet(char *ver, char *code, char *content, long length, long *p_length)
{
char *packet = (char *)malloc(BUFFER_SIZE);
char *len_str = malloc(BUFF_64);
_itoa(length, len_str, 10);
char *content_len = "Content-length: ";
char *content_type = "Content-Type: ";
long len = strlen(ver) + 1;
len += strlen(code) + strlen(HTTP_DELIM);
len += strlen(content_len) + strlen(len_str) + strlen(HTTP_DELIM);
len += strlen(content_type) + strlen(HTTP_HTML_TYPE_TEXT) +strlen(HTTP_DELIM);
len += strlen(content);
*p_length = len;
// This is where problems start...
// ##############################################################
strncat(ver, packet, BUFFER_SIZE - 1); // Trouble starts here
strncat(" ", packet, BUFFER_SIZE - 1);
strncat(code, packet, BUFFER_SIZE - 1);
strncat(HTTP_DELIM, packet, BUFFER_SIZE - 1);
strncat(content_len, packet, BUFFER_SIZE - 1);
strncat(len_str, packet, BUFFER_SIZE - 1);
strncat(HTTP_DELIM, packet, BUFFER_SIZE - 1);
strncat(content_type, packet, BUFFER_SIZE - 1);
strncat(HTTP_HTML_TYPE_TEXT, packet, BUFFER_SIZE - 1);
strncat(HTTP_DELIM, packet, BUFFER_SIZE - 1);
strncat(content, packet, BUFFER_SIZE - 1);
return packet;
}
(当然我应该(而且我会)向 strncat 添加验证,以便它最终发送所有数据)
我的问题是: 为什么第一个 strncat
调用不起作用并引发访问冲突错误?我做错了什么?
您混淆了 strncat 的参数。第一个参数应该是目标缓冲区。
strncat(ver, packet, BUFFER_SIZE - 1); // Trouble starts here
strncat(" ", packet, BUFFER_SIZE - 1);
...
您将来自 packet
的相同随机(而非 nul 终止)数据添加到不同大小的其他各种缓冲区。
这应该是
strncat(packet, ver, BUFFER_SIZE - 1); // Trouble starts here
strncat(packet, " ", BUFFER_SIZE - 1);
...
你也应该先初始化packet
:
packet[0] = 0;
strncat(packet, ver, BUFFER_SIZE - 1);
strncat(packet, " ", BUFFER_SIZE - 1);
...
您似乎误解了 strncat()
的语义:
- 第一个参数是指向目标数组的指针。
- 第二个参数是指向源字符串或数组的指针,
- 第三个参数是要从源复制的最大字符数,而不是目标字符串的最大长度。
我正在编写一个 Web 服务器,我在其中通过 WinSock
套接字从客户端接收数据,并将数据解析为多个部分。然后,根据找到的方法和请求的资源,我想建立一个新的数据包,我将发送回客户端。
我有这个功能,用来构建数据包发送nack给客户端:(BUFFER_SIZE=2048
)
char* build_packet(char *ver, char *code, char *content, long length, long *p_length)
{
char *packet = (char *)malloc(BUFFER_SIZE);
char *len_str = malloc(BUFF_64);
_itoa(length, len_str, 10);
char *content_len = "Content-length: ";
char *content_type = "Content-Type: ";
long len = strlen(ver) + 1;
len += strlen(code) + strlen(HTTP_DELIM);
len += strlen(content_len) + strlen(len_str) + strlen(HTTP_DELIM);
len += strlen(content_type) + strlen(HTTP_HTML_TYPE_TEXT) +strlen(HTTP_DELIM);
len += strlen(content);
*p_length = len;
// This is where problems start...
// ##############################################################
strncat(ver, packet, BUFFER_SIZE - 1); // Trouble starts here
strncat(" ", packet, BUFFER_SIZE - 1);
strncat(code, packet, BUFFER_SIZE - 1);
strncat(HTTP_DELIM, packet, BUFFER_SIZE - 1);
strncat(content_len, packet, BUFFER_SIZE - 1);
strncat(len_str, packet, BUFFER_SIZE - 1);
strncat(HTTP_DELIM, packet, BUFFER_SIZE - 1);
strncat(content_type, packet, BUFFER_SIZE - 1);
strncat(HTTP_HTML_TYPE_TEXT, packet, BUFFER_SIZE - 1);
strncat(HTTP_DELIM, packet, BUFFER_SIZE - 1);
strncat(content, packet, BUFFER_SIZE - 1);
return packet;
}
(当然我应该(而且我会)向 strncat 添加验证,以便它最终发送所有数据)
我的问题是: 为什么第一个 strncat
调用不起作用并引发访问冲突错误?我做错了什么?
您混淆了 strncat 的参数。第一个参数应该是目标缓冲区。
strncat(ver, packet, BUFFER_SIZE - 1); // Trouble starts here
strncat(" ", packet, BUFFER_SIZE - 1);
...
您将来自 packet
的相同随机(而非 nul 终止)数据添加到不同大小的其他各种缓冲区。
这应该是
strncat(packet, ver, BUFFER_SIZE - 1); // Trouble starts here
strncat(packet, " ", BUFFER_SIZE - 1);
...
你也应该先初始化packet
:
packet[0] = 0;
strncat(packet, ver, BUFFER_SIZE - 1);
strncat(packet, " ", BUFFER_SIZE - 1);
...
您似乎误解了 strncat()
的语义:
- 第一个参数是指向目标数组的指针。
- 第二个参数是指向源字符串或数组的指针,
- 第三个参数是要从源复制的最大字符数,而不是目标字符串的最大长度。