私はソケットネットワーク上の課題に取り組んでおり、クライアントとサーバは接続して通信することができます。時間。たとえば、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の部分です。
あなたの 'package = malloc(...)'行に 'strlen(read_line + 1)'が 'strlen(read_line)+ 1'となると思います。 – yano
その中にstrlen()を持つネットワークコードです。正解の可能性は0に向かう。 –