i need on program have create school. don't know how go reading in , manipulating data bin file. bin file in form of tcp header , need to:
- read binary file struct , print header.
- create response header , write new file.
- read response binary file , print header.
this have far:
struct tcp { unsigned char sourceport[2]; unsigned char destination[2]; unsigned char sequence[4]; unsigned char ackno[4]; unsigned char other[2]; unsigned char window[2]; unsigned char checksum[2]; unsigned char urgent[2]; } my_header; int readfile(char filename[]) { file *fp; int pointer, i; unsigned char buffer[20]; fp = fopen(filename, "r"); if(!fp){ return 1; } fread(&my_header, sizeof(my_header), 1, fp); = 0; pointer = 0; while (pointer < 2) { my_header.sourceport[pointer] = buffer[pointer]; pointer++; } while (pointer < 4) { my_header.destination[pointer - 2] = buffer[pointer]; pointer++; } while(pointer < 8) { my_header.sequence[pointer - 4] = buffer[pointer]; pointer++; } while(pointer < 12) { my_header.ackno[pointer - 8] = buffer[pointer]; pointer++; } while(pointer < 14) { my_header.other[pointer - 12] = buffer[pointer]; pointer++; } while(pointer < 16) { my_header.window[pointer - 14] = buffer[pointer]; pointer++; } while(pointer < 18) { my_header.checksum[pointer - 16] = buffer[pointer]; pointer++; } while(pointer < 20) { my_header.urgent[pointer - 18] = buffer[pointer]; pointer++; } fclose(fp); return 0; } int main(int argc, char* argv) { int check; unsigned char swap[2]; check = readfile("test.bin"); /* checking file read */ if(check == 0) { printf("file read\n"); } /* if file not found */ if(check == 1) { printf("cannot open/find file.\n"); } strcpy(swap,my_header.sourceport); strcpy(my_header.sourceport, my_header.destination); strcpy(my_header.destination, swap); writefile("test.bin"); return 0; }
there several issues readfile function.
the main problem taking values in buffer (which unassigned) , writing garbage values struct fields. you're passing in address of my_header instead of buffer.
also, you're not checking return value of fread(), don't know if call failed or if returned enough bytes.
as turns out, reading directly my_header preferred way handle this. assuming read successful , struct fields same size , in same order file contents, don't need else. structure populated.
so function should this:
int readfile(char filename[]) { file *fp; int bytes_read; fp = fopen(filename, "r"); if (!fp) { perror("fopen failed"); return 1; } bytes_read = fread(&my_header, sizeof(my_header), 1, fp); if (bytes_read == -1) { perror("fread failed"); fclose(fp); return 1; } else if (bytes_read != sizeof(my_header)) { fprintf(stderr, "expected read %d bytes, read %d\n", sizeof(my_header), bytes_read); fclose(fp); return 1; } fclose(fp); return 0; } note use of perror print detailed error messages fopen , fread, , ensuring call fclose(fp) in error cases after file has been opened.
edit:
the struct contains char arrays, not strings arrays of bytes, can't use strcpy or other string manipulation functions on them. can use memcpy:
memcpy(swap,my_header.sourceport, 2); memcpy(my_header.sourceport, my_header.destination, 2); memcpy(my_header.destination, swap, 2);
Comments
Post a Comment