C strncat无法正常工作并引发访问冲突

时间:2017-01-16 12:23:56

标签: c parsing c-strings

我正在编写一个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电话无法正常工作并引发访问冲突错误?我做错了什么?

2 个答案:

答案 0 :(得分:2)

你混淆了strncat的参数。第一个参数应该是目标缓冲区。

strncat(ver, packet, BUFFER_SIZE - 1); // Trouble starts here
strncat(" ", packet, BUFFER_SIZE - 1);
...

您将packet中的相同随机(而非终止)数据添加到不同大小的其他缓冲区。

这应该是

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);
...

答案 1 :(得分:1)

您似乎误解了strncat()的语义:

  • 第一个参数是指向目标数组的指针。
  • 第二个参数是指向源字符串或数组的指针
  • 第三个参数是从源复制的最大字符数,而不是目标字符串的最大长度。