2017-11-14 11 views
0

私はソケットネットワーク上の課題に取り組んでおり、クライアントとサーバは接続して通信することができます。時間。たとえば、5つのデータの要求を送信すると、mallocのメモリ破損のためにサーバーがクラッシュします。ループ内でデータを送信すると、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); 
} 

私はそれが(?少なくとも私はそう思う)上書きメモリとは何かを知っているが、私はどこか理由を知りません。

動作する部分は、本質的にすべて私が好きなだけ呼び出すことができる番号< number_of_jobsの部分です。

+1

あなたの 'package = malloc(...)'行に 'strlen(read_line + 1)'が 'strlen(read_line)+ 1'となると思います。 – yano

+1

その中にstrlen()を持つネットワークコードです。正解の可能性は0に向かう。 –

答えて

2

*(read_line + strlen(read_line)-1) = '\0';を呼び出すには、read_lineはnullで終了すると思いますか?もしそれがヌル終了する必要があるなら、あなたはより良いと書いてください。read_line[n] = '\0'。あなたがすでにnバイトを読んだことを知っているので、あとでstrlenに電話する必要はありません。

+0

それはそれだったの?私はもっ​​と頻繁に寝る必要がある...ありがとう! – Telanore

+0

@Telanore:これがあなたの質問に答えるなら、答えを受け入れてください。このサイトはすべての年齢層の人々によって使用されているので、上記のコメントを削除してください。 –

関連する問題