c - How to read/write from a tcp header bin file -


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:

  1. read binary file struct , print header.
  2. create response header , write new file.
  3. 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