如何从tcp头文件bin文件读取/写入

时间:2015-07-17 08:28:16

标签: c tcp bin read-write

我需要一些关于我必须为学校创建的计​​划的帮助。我不确切知道如何从bin文件中读取和操作数据。 bin文件采用TCP头的形式,我需要:

  1. 将二进制文件读入结构并打印标题。
  2. 创建响应标头并将其写入新文件。
  3. 读取响应二进制文件并打印标题。
  4. 这是我到目前为止所做的:

    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);
        i = 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 for file to read */
        if(check == 0)
        {
            printf("File successfully read\n");
        }
    
        /* If file is 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;
    }
    

1 个答案:

答案 0 :(得分:0)

您的readfile功能存在多个问题。

主要问题是你在缓冲区中取值(未分配)并将这些垃圾值写入struct字段。您传递的地址为my_header,而不是buffer

此外,您没有检查fread()的返回值,因此您不知道调用是否失败或者是否返回了足够的字节数。

事实证明,直接阅读my_header实际上是处理此问题的首选方法。假设读取成功并且struct字段的大小和文件内容的顺序相同,则不需要执行任何其他操作。该结构已经填充。

所以你的功能应该是这样的:

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 to read %d bytes, actually read %d\n", sizeof(my_header), bytes_read);
        fclose(fp);
        return 1;
    }

    fclose(fp);
    return 0;
}

请注意使用perror打印fopenfread的详细错误消息,并确保在文件打开后在错误情况下调用fclose(fp)。< / p>

编辑:

struct包含char数组,但它们不是字符串而是字节数组,所以你不能在它们上使用strcpy或其他字符串操作函数。但是,您可以使用memcpy

memcpy(swap,my_header.sourceport, 2);
memcpy(my_header.sourceport, my_header.destination, 2);
memcpy(my_header.destination, swap, 2);