在循环中发送数据会导致malloc内存损坏

时间:2017-11-14 16:24:21

标签: c sockets server malloc

我正在处理套接字网络上的任务,并且有一个客户端和服务器可以连接和通信正常,只要我当时只发送一个数据请求。一旦我发送了5个数据的请求,服务器就会因malloc内存损坏而崩溃。

我有:

int number_of_jobs;
msg[0] = '0';

read(sd, &number_of_jobs, 4);

for(int i = 0; i < number_of_jobs; i++){
    printf("Total bytes read: %lu\n", total_bytes_read);
    printf("Size: %lu\n", size);
    printf("i: %d\n", i);
    char jobtype;
    unsigned int len;
    fread(&jobtype, sizeof(jobtype), 1, fp);
    DEBUG_PRINT(("\n>>%d<< Jobtype: %c\n", getpid(), jobtype));

    fread(&len, 4, 1, fp);
    DEBUG_PRINT((">>%d<< Len: %d\n", getpid(), len));

    header = make_header(jobtype, len, size);

    read_line = malloc(sizeof(char)*len + 1);
    int n = fread(read_line, sizeof(char), len, fp);
    if(n <= 0){
        printf(">>%d<< ", getpid());
        perror("Fread error");
    }
    *(read_line + strlen(read_line)-1) = '\0';
    total_bytes_read += strlen(read_line);

    package = malloc(sizeof(char)*40 + sizeof(char)* strlen(read_line+1));

    strncpy(package, header, 41);
    strcat(package, read_line);

    printf("%s\n", package);

    if(write(sd, package, strlen(package)) < 0){
        printf(">>%d<< ", getpid());
        perror("Write error");
    }
    printf("Writing %zu bytes\n", strlen(read_line));

    free(package);
    free(header);
    free(read_line);
}

我知道它与覆盖记忆有关(至少我是这么认为的?),但我不知道在哪里或为什么。

有效的部分基本上是for i&lt; number_of_jobs部分,我可以根据需要多次拨打电话。

1 个答案:

答案 0 :(得分:2)

是什么让您认为read_line以null结尾以致电*(read_line + strlen(read_line)-1) = '\0';?如果你需要使它以空终止,你最好写read_line[n] = '\0'。此后,您无需再致电strlen,因为您已经知道自己已经读过n个字节。